使用Python子进程通讯方法时如何获取退出代码?


185

使用Python的subprocess模块和communicate()方法时,如何检索退出代码?

相关代码:

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

我应该以其他方式这样做吗?

Answers:


264

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 hasnt 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


34
这个示例对我有帮助,但是如果示例不执行“将子进程作为sp导入”模式(将标准内容作为晦涩的缩写形式导入)的话,那就更好了。尽管这样做可以将其后的代码减少8个字符,但也难以理解和重用。
uglycoyote

16
@uglycoyote没有规则说您必须复制并粘贴。只需重新输入即可,就像4行一样。
杰森C

5
@uglycoyote您也可以将其编辑为类似内容from subprocess import Popen,然后使用它Popen代替subprocess(or sp).Popen它,我想这可能会提高可读性并缩短行数
Mitch

2
是的...必须先调用process.communicate(),然后分配returncode给某个变量。如果分配是在调用之前完成的communicate,则为None
WesternGun

1
是否可以显示返回代码而无需重定向管道?我正在调用bash代码,我想在终端中实时查看输出
-Nisba,

9

您首先应确保该进程已完成运行,并且已使用该.wait方法读取了返回代码。这将返回代码。如果您以后想要访问它,则将其存储.returncodePopen对象中。


24
.communicate()已经在等待子进程终止。
机械蜗牛

8

.poll() 将更新返回码。

尝试

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

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


当我这样做时,.poll()为空。我必须在child.poll()上方的行中运行child.communicate()才能正常工作。
NateW

1
我认为您打算根据文档使用.wait()而不是.poll():docs.python.org/3/library/subprocess.html。请注意,.wait()采用可选的超时参数,这可能很方便。
gg99


1

这对我有用。它还打印子进程返回的输出

child = subprocess.Popen(serial_script_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    retValRunJobsSerialScript = 0
    for line in child.stdout.readlines():
        child.wait()
        print line           
    retValRunJobsSerialScript= child.returncode
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.