我有一个python 2.7脚本,可以从其中使用stdout = PIPE和stderr = STDOUT通过Popen打开一个子进程。
启动子进程后,我的主脚本会执行其他一些工作,稍后,它将在子进程上执行p.communicate()。在启动子流程和对其进行调用之间的经过时间中,我的子流程已经完成其工作并且已经干净退出,但是仍然可以从其stdout读取通讯。我的子进程完成运行后会发生什么,其stdout和stderr将打开多长时间?
在这种情况下,stdout
和stderr
上的字节只是在内存中缓冲,等待您从缓冲区中读取。当您调用p.communicate()
时,它将读取缓冲区并返回两个Python对象的元组,其中两个Python对象分别包含来自stdout和stderr的数据。当您将stdout和stderr结合在一起时(如此处所做的那样),在元组中返回的第二个值将始终为None
,所有数据交织出现在元组的第一个值中。
[如subprocess.communicate
文档中所警告的,如果该过程会产生大量输出,则必须小心不要使缓冲区溢出。
[注:读取的数据缓存在内存中,因此,如果数据大小很大或没有限制,请不要使用此方法。
呼叫subprocess.communicate
也是阻塞呼叫,等待过程终止。返回后,stdout / stderr将关闭,并且已设置整数p.communicate()
属性。