问题是,
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避免由于其他任何OS管道缓冲区填充和阻塞子进程而导致死锁。http://docs.python.org/library/subprocess.html#subprocess.Popen.stdout
这个故事的寓意是,对于大的输出,
subprocess.PIPE如果您的程序试图读取数据,它将使您注定要失败(在我看来,您应该能够
p.stdout.read(bytes)陷入
whilep.returnpre is None:循环,但是以上警告表明,这可能会僵局)。
该文档建议以此替换外壳管道:
p1 = Popen(["zgrep", "thingiwant", "largefile"], stdout=PIPE)p2 = Popen(["processreceivingdata"], stdin=p1.stdout, stdout=PIPE)output = p2.communicate()[0]
请注意,这
p2是直接从获取标准输入
p1。这 应该 避免死锁,但是鉴于上述矛盾的警告, 谁知道 。
无论如何,如果最后一部分对您不起作用( 应该
可以),您可以尝试创建一个临时文件,将第一次调用中的所有数据写入该文件,然后使用该临时文件作为下一步的输入。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)