Python subprocess.check_output stderr用法

时间:2016-10-24 16:02:41

标签: python subprocess

您好我是Python的新手,我正在尝试了解stderr如何与子进程check_output一起使用。我已经阅读了子流程文档,并且很难理解stderr的使用方式以及具体subprocess.STDOUT实际完成的内容。

我可以获得一些解释如何在这里使用stderr的示例或参考资料吗?

我已经尝试过使用stderr和没有使用stderr并且没有看到任何真正的差异。

代码:

#!/usr/bin/python3
import subprocess

print(subprocess.check_output("echo Hello World!",
                              stderr=subprocess.STDOUT,
                              shell=True))

输出:

# ./ex.py
b'Hello World!\n'

代码:

#!/usr/bin/python3
import subprocess

print(subprocess.check_output("gecho Hello World!",
                              stderr=subprocess.STDOUT,
                              shell=True))

输出:

# ./ex.py
Traceback (most recent call last):
  File "./ex.py", line 6, in <module>
    shell=True))
  File "/usr/lib64/python3.3/subprocess.py", line 589, in check_output
    raise CalledProcessError(retcode, process.args, output=output)
subprocess.CalledProcessError: Command 'gecho Hello World!' returned non-zero exit status 127

1 个答案:

答案 0 :(得分:1)

如果存在非零退出代码,

subprocess.check_output 将引发您看到的异常。这听起来像你想要获得的是一种简单的读取STDERR的方法,在这种情况下,最简单的方法是使用 subprocess.run 和管道STDOUT和STDERR(示例在Windows中) ):

>>> p = subprocess.run(['cmd','/C','echo','hello','world'], stdout = subprocess.PIPE, stderr=subprocess.PIPE)
>>> p.stdout
b'hello world\r\n'

>>> p.stderr
b''

>>> p = subprocess.run(['cmd','/C','gecho','hello','world'], stdout = subprocess.PIPE, stderr=subprocess.PIPE)
>>> p.stdout
b''

>>> p.stderr
b"'gecho' is not recognized as an internal or external command,\r\noperable program or batch file.\r\n"

如果您真的需要使用check_output,以下内容将忽略echo调用中的错误代码并仍然打印错误(示例几乎逐字地从文档中获取):

>>> print(subprocess.check_output('gecho hello& exit 0', stderr=subprocess.STDOUT, shell=True))
b"'gecho' is not recognized as an internal or external command,\r\noperable program or batch file.\r\n"

或者在Linux中:

>>> print(subprocess.check_output('gecho hello; exit 0', stderr=subprocess.STDOUT, shell=True))
b'/bin/sh: 1: gecho: not found\n'

作为旁注,使用选项 shell = True 的子进程函数几乎永远是一个好主意。这主要是出于安全考虑;阅读文档以获得完整的解释。