我有两个小python文件,第一个使用input
读取一行,然后打印另一行
a = input()
print('complete')
第二次尝试将其作为子进程运行
import subprocess
proc = subprocess.Popen('./simp.py',
stdout=subprocess.PIPE,
stdin=subprocess.PIPE,
bufsize=1)
print('writing')
proc.stdin.write(b'hey\n')
print('reading')
proc.stdout.readline()
上面的脚本将先打印“正在书写”,然后显示“正在阅读”,然后挂起。最初,我认为这是一个stdout缓冲问题,所以我将
bufsize=1
更改为bufsize=0
,这确实解决了该问题。但是,似乎是标准输入引起了问题。使用
bufsize=1
,如果我在写操作下方添加proc.stdin.flush()
,则该过程将继续。这两种方法都显得笨拙,因为(1)未缓冲的流很慢(2)在所有地方添加刷新都很容易出错。为什么上面的write
不能在换行符上刷新?文档说在为子流程创建stdin,stdout和stderr流时使用了bufsize
,那么是什么导致写操作不能在换行符上刷新呢? 最佳答案
在the docs中:“1表示行被缓冲(仅当Universal_newlines = True,即在文本模式下可用)。”这有效:
import subprocess
proc = subprocess.Popen('./simp.py',
stdout=subprocess.PIPE,
stdin=subprocess.PIPE,
bufsize=1,
universal_newlines=True)
print('writing')
proc.stdin.write('hey\n')
print('reading')
proc.stdout.readline()
关于python - 子进程stdin缓冲区未在bufsize = 1的换行符上刷新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27571305/