【问题标题】:Get only stderr output from subprocess.check_output仅从 subprocess.check_output 获取 stderr 输出
【发布时间】:2017-01-19 17:02:02
【问题描述】:

我想在 python 中运行一个外部进程,并且只处理它的stderr

我知道我可以使用subprocess.check_output,但是如何将标准输出重定向到/dev/null(或以任何其他方式忽略它),并且只接收stderr

【问题讨论】:

  • 复制错误,check_output 不允许覆盖stdout
  • 是否有理由仅在 Python 2.7 中使用它?
  • 那么您想在 errorsuccess 或两者兼有的情况下捕获输出吗?
  • @JRichardSnape:我只需要它用于 Python 2.7,因为我的代码库基于 python 2.7。
  • @AnttiHaapala 在错误和成功的情况下,我只想捕获标准错误

标签: python python-2.7 subprocess stderr


【解决方案1】:

不幸的是,你已经标记了这个,就像在 python 3.5 及更高版本中一样,使用run() 会很简单:

import subprocess

output = subprocess.run(..., stdout=subprocess.DEVNULL,
                        stderr=subprocess.PIPE).stderr

使用check_output() stdout 根本无法重定向:

>>> subprocess.check_output(('ls', 'asdfqwer'), stdout=open(os.devnull, 'wb'), stderr=subprocess.STDOUT)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/subprocess.py", line 566, in check_output
    raise ValueError('stdout argument not allowed, it will be overridden.')
ValueError: stdout argument not allowed, it will be overridden.

Popen 对象和communicate() 与低于3.5 的python 版本一起使用。在 python 2.7 中使用os.devnull 打开/dev/null

>>> import subprocess
>>> import os
>>> with open(os.devnull, 'wb') as devnull:
...     proc = subprocess.Popen(('ls', 'asdfqwer'),
...                             stdout=devnull,
...                             stderr=subprocess.PIPE)
...     proc.communicate()
...     proc.returncode
... 
(None, "ls: cannot access 'asdfqwer': No such file or directory\n")
2

通信将输入发送到标准输入(如果通过管道传输),并从标准输出和标准错误读取,直到到达文件结尾。

【讨论】:

  • 感谢您的帮助。我找到了一种简单的方法。
【解决方案2】:

我发现了一个简单的技巧:

import subprocess
stderr_str = subprocess.check_output('command 2>&1 >/dev/null')

这将过滤掉标准输出,只保留标准错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-19
    • 2014-02-24
    • 2014-09-11
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 2014-12-04
    相关资源
    最近更新 更多