您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python的Popen清理

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)陷入while p.returncode is None:循环,但是以上警告表明,这可能会僵局)。

该文档建议以此替换外壳管道:

p1 = Popen(["zgrep", "thingiwant", "largefile"], stdout=PIPE)
p2 = Popen(["processreceivingdata"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]

请注意,这p2是直接从获取标准输入p1。这 应该 避免死锁,但是鉴于上述矛盾的警告, 谁知道

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

python 2022/1/1 18:34:30 有221人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶