2011-04-12 28 views

回答

187

Popen.communicate将在完成(*)时设置returncode属性。下面是相关文档部分:

Popen.returncode 
    The child return code, set by poll() and wait() (and indirectly by communicate()). 
    A None value indicates that the process hasn’t terminated yet. 

    A negative value -N indicates that the child was terminated by signal N (Unix only). 

所以,你可以这样做(我没有测试它,但它应该工作):

import subprocess as sp 
child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE) 
streamdata = child.communicate()[0] 
rc = child.returncode 

(*)会出现这种情况,因为方式它的实现:在设置线程读取子流之后,它只调用wait

+7

这个例子对我很有帮助,但是如果例子没有将“import subprocess as sp”模式导入标准作为一个不起眼的缩写,那将会很好。虽然这会削减跟随它的代码8个字符,但它也使得难以理解和重用。 – uglycoyote 2016-10-19 18:36:45

+5

@uglycoyote没有规定说你必须复制和粘贴。只要重新键入它就可以了,就像4线一样。 – 2016-10-31 13:45:55

+0

@uglycoyote你也可以将它编辑为'from subprocess import Popen',然后使用'Popen'而不是'subprocess(或sp).Popen',这可能会增加可读性并缩短行数 – Mitch 2016-11-18 18:43:30

4

exitcode = data.wait()。子进程将被阻塞如果它写入标准输出/错误,和/或从标准输入读取,并且没有对等体。

7

您应该首先确保该过程已完成运行,并使用.wait方法读取了返回码。这将返回代码。如果您想稍后访问它,则将其作为.returncode存储在Popen对象中。

+15

'.communicate()'已经等待子进程终止。 – 2013-08-21 07:10:49

1

.poll()将更新返回码。

尝试

child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE) 
returnCode = child.poll() 

此外,.poll()被调用后返回的代码可以在对象child.returncode

相关问题