subprocess.PIPE何时关闭?

时间:2019-05-17 09:05:08

标签: python python-3.x python-2.7 subprocess

首先我的问题是:

在我向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永远没有机会读取它?

1 个答案:

答案 0 :(得分:0)

这取决于第一个子项如何处理其输入数据。 cat程序(我假设它是/bin/cat)可确保它将读取stdin直到文件结束,并在退出之前将其在stdout上可以读取的所有内容写入,除非它收到信号。

在这里没有问题,并且在所有内容都写入p1.stdin.close()文件之后,test会干净地关闭两个孩子。

但是p1.stdin.flush()可能无效。它将确保所有数据已从Python传递到p1子级。但是/bin/cat在未连接到终端时会缓冲其输出,在这种情况下,因为它已连接到管道,所以会进行缓冲。因此,p2catp1的输出缓冲区已满或p1 stdin已关闭之前将不会接收任何东西。