栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python的Popen清理

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/611719.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号