我使用下面的代码来获取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
。怎么做?
答案 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
是例外。
如果不清楚,请告诉我。