Python subprocess.check_output stderr用法

Python subprocess.check_output stderr用法,python,subprocess,Python,Subprocess,大家好,我是Python的新手,我想了解stderr是如何与子进程check_输出一起使用的。我已经阅读了子流程文档,很难理解stderr是如何使用的,以及subprocess.STDOUT实际上完成了什么 我可以通过一些示例或参考来获得一些帮助,这些示例或参考解释了stderr在这里的用法吗 我尝试了使用stderr和unnote的这些命令,但没有看到任何真正的区别 代码: 输出: # ./ex.py b'Hello World!\n' # ./ex.py Traceback (most r

大家好,我是Python的新手,我想了解stderr是如何与子进程check_输出一起使用的。我已经阅读了子流程文档,很难理解stderr是如何使用的,以及
subprocess.STDOUT
实际上完成了什么

我可以通过一些示例或参考来获得一些帮助,这些示例或参考解释了stderr在这里的用法吗

我尝试了使用stderr和unnote的这些命令,但没有看到任何真正的区别

代码:

输出:

# ./ex.py
b'Hello World!\n'
# ./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
代码:

输出:

# ./ex.py
b'Hello World!\n'
# ./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
#/ex.py
回溯(最近一次呼叫最后一次):
文件“/ex.py”,第6行,在
shell=True)
检查输出中的文件“/usr/lib64/python3.3/subprocess.py”,第589行
引发被调用的进程错误(retcode,process.args,output=output)
subprocess.CalledProcessError:命令“gecho Hello World!”返回非零退出状态127
subprocess.check\u如果存在非零退出代码,则输出将引发异常。听起来您试图获得的是一种读取STDERR的简单方法,在这种情况下,最简单的方法是使用subprocess.run和pipe STDOUT和STDERR(示例在Windows中):

如果您确实需要使用check_输出,以下内容将忽略echo调用中的错误代码,并仍然打印错误(示例几乎是从文档中逐字提取的):

或者在Linux中:

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

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

您得到的是CalledProcessError,因为返回代码为非零,all
stderr=subprocess。STDOUT
将stderr重定向到STDOUT,这与捕获python代码中的错误无关。如果您没有将stderr重定向到stdour,则输出stderr的任何内容都将被输出到屏幕上,而不会被check_输出捕获。这是一个可能需要使用stderr=subprocess.STDOUT的示例。@PadraicCunningham如何读取定向到stderr或重定向到STDOUT的内容?有什么必要将其重定向到stdout?谢谢,如果您调用管道输出stderr而不是stdout,并且希望捕获输出,该怎么办?你可以在上面的链接中看到这一点。如果它通过管道输出错误,默认情况下它不会将错误打印到终端吗?@padraiccanningham这就是我要找的链接。是的,我没有完全理解它们是什么。非常有用。谢谢
>>> 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"
>>> print(subprocess.check_output('gecho hello; exit 0', stderr=subprocess.STDOUT, shell=True))
b'/bin/sh: 1: gecho: not found\n'