gpt4 book ai didi

Python subprocess.check_output stderr 用法

转载 作者:行者123 更新时间:2023-11-28 18:27:34 29 4
gpt4 key购买 nike

您好,我是 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

最佳答案

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 使用子进程函数几乎不是一个好主意。这主要是出于安全考虑;阅读文档以获得完整的解释。

关于Python subprocess.check_output stderr 用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40222793/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com