Python:从命令行获取输出,该命令行以非零退出代码退出

时间:2011-02-16 18:26:34

标签: python subprocess stdout windows-server-2008-r2 stderr

我在Windows Server 2008 R2 x64框上使用Python 2.7.1

我正在尝试获取命令行进程的输出,该进程在输出我需要的信息后会给出非零退出状态。

我最初使用subprocess.check_output并捕获以非零退出状态发生的CalledProcessError,但是当返回码存储在错误中时,没有输出显示此信息。

针对提供输出但退出状态为0的情况运行此方法正常工作,我可以使用subprocess.check_output获取输出。

我的假设是输出被写入STDOUT,但异常从STDERR中拉出“输出”。我试图重新实现check_output的功能,但是当我相信我应该看到输出到STDOUT和STDERR时,我仍然没有得到输出。我当前的代码如下(其中'command'是我正在运行的命令的全文,包括参数:

process = subprocess.Popen(command, stdout=subprocess.PIPE, 
stderr=subprocess.STDOUT, universal_newlines=True)
output = process.communicate()
retcode = process.poll()
if retcode:
    raise subprocess.CalledProcessError(retcode, image_check, output=output)
    return output 

这在变量输出中给出了以下内容:[('', None)]

我的subprocess.Popen代码是否正确?

3 个答案:

答案 0 :(得分:10)

您的代码工作正常。事实证明,您正在调用的进程可能正在输出到CON。请参阅以下示例

import subprocess

def check_output(command):
    process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)
    output = process.communicate()
    retcode = process.poll()
    if retcode:
            raise subprocess.CalledProcessError(retcode, command, output=output[0])
    return output 

command = "echo this>CON"

print "subprocess -> " + subprocess.check_output(command, shell=True)
print "native -> " + str(check_output(command))

try:
    subprocess.check_output("python output.py", shell=True)
except subprocess.CalledProcessError, e:
    print "subproces CalledProcessError.output = " + e.output

try:
    check_output("python output.py")
except subprocess.CalledProcessError, e:
    print "native CalledProcessError.output = " + e.output

输出

subprocess -> 
native -> ('', None)
stderr subproces CalledProcessError.output = stdout
native CalledProcessError.output = stderr stdout

可悲的是,我不知道如何解决这个问题。请注意,subprocess.check_output结果仅包含stdout的输出。 check_output替换将输出stderr和stdout。

在检查subprocess.check_output之后,它确实生成了一个CalledProcessError,其输出只包含stdout。

答案 1 :(得分:2)

您是否尝试过python doc页面中提到的stderr=subprocess.STDOUT

  

要在结果中捕获标准错误,请使用   标准错误= subprocess.STDOUT:

这是一个测试代码:

import subprocess

try:
    subprocess.check_output('>&2 echo "errrrr"; exit 1', shell=True)
except subprocess.CalledProcessError as e:
    print 'e.output: ', e.output


try:
    subprocess.check_output('>&2 echo "errrrr"; exit 1', shell=True, stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
    print 'e.output: ', e.output

输出:

errrrr
e.output:  
e.output:  errrrr

答案 2 :(得分:1)

这里有一个问题可能会打击你 - http://bugs.python.org/issue9905