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

bpl*_*urg 6 python subprocess stdout stderr windows-server-2008-r2

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

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

我最初使用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 
Run Code Online (Sandbox Code Playgroud)

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

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

Rod*_*Rod 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
Run Code Online (Sandbox Code Playgroud)

产量

subprocess -> 
native -> ('', None)
stderr subproces CalledProcessError.output = stdout
native CalledProcessError.output = stderr stdout
Run Code Online (Sandbox Code Playgroud)

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

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