2017-07-03 168 views
0

我正在使用下面的代码获取shell命令的输出。subprocess.CalledProcessError没有给出错误信息

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)) 

当一个有效的命令被传递了cmdecho hello,程序运行正常,并给予输出(0, None, "hello\n")

但是,如果我给一个错误的一种命令的我期待的错误消息应该来在err,但它直接打印。例如,如果我通过在cmdls -lrt foo输出来作为

[email protected]> 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到来。怎么做?

回答

2

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

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

让我知道如果这不明确。