首先我的问题是:
在我向p1.stdin
写一些字符串之后。我在test
文件中看不到任何内容。
p1 = subprocess.Popen('cat ', stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True, universal_newlines=True)
p2 = subprocess.Popen('cat ', stdin=p1.stdout, stdout=open("test", 'w'), shell=True, universal_newlines=True)
p1.stdin.write('asda'*100)
然后我从stackoverflow
得到了答案。
原因是bufsize
的默认参数是-1
,这意味着这是一个buffered
IOWrapper。我需要使文本存在于p1.stdin
中。
因此解决方案是:p1.stdin.flush()
或p1.stdin.close()
或p1.communicate()
我发现p2
需要从opened
类文件对象(p1.stdout
)中读取,并且在我使用p1.stdout
或{之后,p1.communicate()
已关闭{1}}。
我的问题是:
p1.stdin.close()
何时关闭,
如果某些数据可能仍保留在p1.stdout
中,而p2永远没有机会读取它?
答案 0 :(得分:0)
这取决于第一个子项如何处理其输入数据。 cat
程序(我假设它是/bin/cat
)可确保它将读取stdin直到文件结束,并在退出之前将其在stdout上可以读取的所有内容写入,除非它收到信号。
在这里没有问题,并且在所有内容都写入p1.stdin.close()
文件之后,test
会干净地关闭两个孩子。
但是p1.stdin.flush()
可能无效。它将确保所有数据已从Python传递到p1
子级。但是/bin/cat
在未连接到终端时会缓冲其输出,在这种情况下,因为它已连接到管道,所以会进行缓冲。因此,p2
在cat
中p1
的输出缓冲区已满或p1
stdin已关闭之前将不会接收任何东西。