subprocess.check_output():显示失败时的输出

gue*_*tli 13 python subprocess

此时的输出subprocess.check_output()看起来像这样:

CalledProcessError: Command '['foo', ...]' returned non-zero exit status 1
Run Code Online (Sandbox Code Playgroud)

有没有办法得到更好的错误信息?

我想看到stdoutstderr.

Jua*_*doy 8

重定向STDERRSTDOUT.

解释器的示例:

>>> try:
...   subprocess.check_output(['ls','-j'], stderr=subprocess.STDOUT)
... except subprocess.CalledProcessError as e:
...   print('error>', e.output, '<')
...
Run Code Online (Sandbox Code Playgroud)

投掷:

error> b"ls: invalid option -- 'j'\nTry `ls --help' for more information.\n" <
Run Code Online (Sandbox Code Playgroud)

Explantion

来自check_output文档:

同时捕获结果中的标准错误,请使用 stderr=subprocess.STDOUT


msv*_*kon 6

不要使用check_output(),使用PopenPopen.communicate()代替:

>>> proc = subprocess.Popen(['cmd', '--optional-switch'])
>>> output, errors = proc.communicate()
Run Code Online (Sandbox Code Playgroud)

output是来自的数据stdouterrors来自的数据stderr.


gue*_*tli 2

由于我不想编写更多代码,只是为了得到一个好的错误消息,所以我编写了subx

来自文档:

subprocess.check_output() 与 subx.call()

观察、比较、思考并决定哪些信息对您更有帮助。

subprocess.check_output()::

CalledProcessError: Command '['cat', 'some-file']' returned non-zero exit status 1
Run Code Online (Sandbox Code Playgroud)

子调用()::

SubprocessError: Command '['cat', 'some-file']' returned non-zero exit status 1:
stdout='' stderr='cat: some-file: No such file or directory'
Run Code Online (Sandbox Code Playgroud)

...特别是如果代码在生产环境中失败,重现错误并不容易,subx 可以调用帮助您找出失败的根源。