首页 文章

subprocess stdin缓冲区没有在bufsize = 1的换行符上刷新

提问于
浏览
4

我有两个小的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()

上面的脚本将打印"writing"然后"reading"但随后挂起 . 起初我以为这是一个stdout缓冲问题,所以我将 bufsize=1 更改为 bufsize=0 ,这确实解决了问题 . 但是,它似乎导致了这个问题 .

使用 bufsize=1 ,如果我在写入下面添加 proc.stdin.flush() ,则该过程继续 . 这两种方法看起来都很笨拙,因为(1)无缓冲的流很慢(2)在任何地方添加刷新都容易出错 . 为什么以上 write 不会在换行符上刷新?文档说在为子进程创建stdin,stdout和stderr流时会使用 bufsize ,那么是什么导致写入不在换行符上刷新?

1 回答

  • 4

    来自the docs:"1 means line buffered (only usable if universal_newlines=True i.e., in a text mode)" . 这有效:

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

相关问题