子进程stdin缓冲区未在bufsize = 1的换行符上刷新

发布于 2021-01-29 14:56:37

我有两个小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=1bufsize=0了,这确实解决问题。但是,似乎是标准输入引起了问题。

使用bufsize=1,如果我proc.stdin.flush()在写入下面添加,则过程继续。这两种方法都显得笨拙,因为(1)无缓冲的流很慢(2)在所有地方添加刷新都很容易出错。为什么上面的代码write不能在换行符上刷新?文档说这bufsize是在为子流程创建stdin,stdout和stderr流时使用的,那么是什么导致写操作不在换行符上刷新呢?

关注者
0
被浏览
66
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    文档中
    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()
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看