subprocess stdin缓冲区没有使用bufsize = 1刷新换行符

时间:2014-12-19 17:49:09

标签: python python-3.x pipe subprocess python-3.3

我有两个小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,那么是什么导致写入不会在换行符上刷新?

1 个答案:

答案 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()