在Python多重处理中,当子进程完全存在时,stdout会发生什么?

问题描述 投票:0回答:1

我有一个python 2.7脚本,可以从其中使用stdout = PIPE和stderr = STDOUT通过Popen打开一个子进程。

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

python-2.7 subprocess python-multiprocessing
1个回答
1
投票

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

[如subprocess.communicate文档中所警告的,如果该过程会产生大量输出,则必须小心不要使缓冲区溢出。

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

呼叫subprocess.communicate也是阻塞呼叫,等待过程终止。返回后,stdout / stderr将关闭,并且已设置整数p.communicate()属性。

© www.soinside.com 2019 - 2024. All rights reserved.