问题是pipe
已经满了。子进程停止,等待管道清空,但随后您的进程(Python 解释器)退出,破坏了管道的末端(因此出现错误消息)。
p.wait()
不会帮助你:
警告如果子进程生成足够的输出到 stdout 或 stderr 管道,从而阻塞等待 OS 管道缓冲区接受更多数据,这将死锁。用来communicate()
避免这种情况。
http://docs.python.org/library/subprocess.html#subprocess.Popen.wait
p.communicate()
不会帮助你:
注意读取的数据是缓存在内存中的,所以如果数据量很大或没有限制,请不要使用此方法。
http://docs.python.org/library/subprocess.html#subprocess.Popen.communicate
p.stdout.read(num_bytes)
不会帮助你:
警告使用communicate()
而不是.stdin.write
,.stdout.read
或.stderr.read
避免由于任何其他操作系统管道缓冲区填满并阻塞子进程而导致的死锁。
http://docs.python.org/library/subprocess.html#subprocess.Popen.stdout
这个故事的寓意是,对于大输出,subprocess.PIPE
如果你的程序试图读取数据,你注定会失败(在我看来,你应该能够p.stdout.read(bytes)
进入一个while p.returncode is None:
循环,但上面的警告表明这可能僵局)。
文档建议用这个替换一个shell pipe:
p1 = Popen(["zgrep", "thingiwant", "largefile"], stdout=PIPE)
p2 = Popen(["processreceivingdata"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]
请注意,p2
它直接从p1
. 这应该可以避免死锁,但鉴于上面的矛盾警告,谁知道呢。
无论如何,如果最后一部分对您不起作用(但它应该),您可以尝试创建一个临时文件,将第一次调用中的所有数据写入该文件,然后将临时文件用作下一个进程的输入。