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

标签 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 的输出时,我仍然没有得到任何输出。我当前的代码如下(其中“命令”是我正在运行的命令的全文,包括参数:

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 代码是否正确?

最佳答案

您的代码工作正常。事实证明,您正在调用的进程可能正在输出到 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 结果仅包含标准输出的输出。您的 check_output 替换将同时输出 stderr 和 stdout。

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

关于Python:从以非零退出代码退出的命令行获取输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5020538/

相关文章:

python - 梯度下降 ANN - MATLAB 正在做什么而我没有做什么?

python - FirefoxWebElement 到字符串?

python - 如何从 Python (2.7) 中生成的进程中删除 Windows 控制台?

python - 可选择将参数传递给 python 中的子进程

android - 使用 dd (Android) 将文件打印到进程标准输出

c - 将 stdout 和 stderr 从 fork 进程复制到文件

python:检查一个键中一定数量的字符是否与同一字典中另一个键的字符匹配

python - 在 Python (pandas) 中计算可变现金流 IRR

python - 通过 subprocess.check_output 调用的可执行文件打印在控制台上但不返回结果

bash 变量分别捕获 stderr 和 stdout 或获取退出值