Python的Popen清理

Python的Popen清理,第1张

Python的Popen清理

问题是,

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
。这 应该 避免死锁,但是鉴于上述矛盾的警告, 谁知道

无论如何,如果最后一部分对您不起作用( 应该
可以),您可以尝试创建一个临时文件,将第一次调用中的所有数据写入该文件,然后使用该临时文件作为下一步的输入。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5617842.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存