我有两个小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()
以上脚本将打印"写"然后"阅读"但后来挂了。起初我认为这是一个缓冲缓冲问题,因此我将bufsize=1
更改为bufsize=0
,这确实解决了问题。然而,它似乎是导致问题的标准差。
使用bufsize=1
,如果我在写入下面添加proc.stdin.flush()
,则该过程继续。这两种方法看起来都很笨拙,因为(1)无缓冲的流很慢(2)在任何地方添加刷新都容易出错。为什么以上write
没有在换行符上刷新?文档说在为子进程创建stdin,stdout和stderr流时使用了bufsize
,那么是什么导致写入不会在换行符上刷新?
答案 0 :(得分:4)
从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()