如何在使用Python的subprocess
模块和communicate()
方法时检索退出代码?如何在使用Python子进程通信方法时获取退出代码?
相关代码:
import subprocess as sp
data = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE).communicate()[0]
我应该做这另一种方式?
如何在使用Python的subprocess
模块和communicate()
方法时检索退出代码?如何在使用Python子进程通信方法时获取退出代码?
相关代码:
import subprocess as sp
data = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE).communicate()[0]
我应该做这另一种方式?
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
。
exitcode = data.wait()
。子进程将被阻塞如果它写入标准输出/错误,和/或从标准输入读取,并且没有对等体。
您应该首先确保该过程已完成运行,并使用.wait
方法读取了返回码。这将返回代码。如果您想稍后访问它,则将其作为.returncode
存储在Popen
对象中。
'.communicate()'已经等待子进程终止。 – 2013-08-21 07:10:49
.poll()
将更新返回码。
尝试
child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE)
returnCode = child.poll()
此外,.poll()
被调用后返回的代码可以在对象child.returncode
。
这个例子对我很有帮助,但是如果例子没有将“import subprocess as sp”模式导入标准作为一个不起眼的缩写,那将会很好。虽然这会削减跟随它的代码8个字符,但它也使得难以理解和重用。 – uglycoyote 2016-10-19 18:36:45
@uglycoyote没有规定说你必须复制和粘贴。只要重新键入它就可以了,就像4线一样。 – 2016-10-31 13:45:55
@uglycoyote你也可以将它编辑为'from subprocess import Popen',然后使用'Popen'而不是'subprocess(或sp).Popen',这可能会增加可读性并缩短行数 – Mitch 2016-11-18 18:43:30