subprocess.CalledProcessError没有给出错误消息

时间:2017-07-03 11:48:02

标签: python python-3.x subprocess

我使用下面的代码来获取shell命令的输出。

import subprocess
exitcode, err, out = 0, None, None
try:
    out = subprocess.check_output(cmd, shell=True, universal_newlines=True)
except subprocess.CalledProcessError as e:
    exitcode, err = e.returncode, e.output

print("x{} e{} o{}".format(exitcode, err, out))

当为cmd echo hello传递有效命令时,程序运行正常,输出为(0, None, "hello\n")

但是,如果我给出了错误的命令,我希望错误信息应该出现在err中,但它会直接打印出来。例如,如果我在ls -lrt foo中传递cmd,则输出将显示为

anirban@desktop> python mytest.py
ls: cannot access foo: No such file or directory
x2 e oNone

所以我希望ls: cannot access foo: No such file or directory应该进入err。怎么做?

1 个答案:

答案 0 :(得分:4)

要捕获错误输出,您需要将另一个参数传递给subprocess.check_output()函数。您需要设置stderr=subprocess.STDOUT。这会将stderr输出引导到e.output

subprocess.check_output()subprocess.run()的包装器。通过传递一些合理的默认值,它使我们的生活更轻松。其中之一是制作stdout=subprocess.PIPE。这会将您正在运行的命令的标准输出定向到您的程序。同样,您可以通过传入参数stderr=subprocess.PIPE将标准错误输出定向到您的程序,这将填充e.stderr,其中e是例外。

如果不清楚,请告诉我。