繁体   English   中英

在 Python 多处理中,当子进程干净地存在时,stdout 会发生什么?

[英]In Python multiprocessing, what happens to stdout when subprocess exists cleanly?

我有一个 python 2.7 脚本,我从中打开一个带有 Popen 和 stdout=PIPE 和 stderr=STDOUT 的子进程。

启动子进程后,我的主脚本会做一些其他工作,然后在子进程上执行 p.communicate() 。 在启动子进程和调用 communicate 之间经过的时间里,我的子进程已经完成了它的工作并且干净地退出了,但是 communicate 仍然可以从它的标准输出中读取。 当我的子进程完成运行时发生了什么,它的标准输出和标准错误将打开多长时间?

在这种情况下, stdoutstderr上的字节只是缓冲在内存中,等待您从缓冲区中读取。 当您调用p.communicate()时,它会读取缓冲区并返回包含分别来自 stdout 和 stderr 的数据的两个 Python 对象的元组。 当您组合 stdout 和 stderr 时,就像您在此处所做的那样,元组中返回的第二个值将始终为None ,所有数据都出现在元组的第一个值中,交错。

subprocess.communicate文档中所警告,如果进程可以产生大量输出,则必须小心不要溢出缓冲区。

注意:读取的数据缓存在内存中,如果数据量很大或没有限制,请不要使用此方法。

调用p.communicate()也是一个阻塞调用,等待进程终止。 返回后,将关闭 stdout/stderr 并设置整数p.returncode属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM