从subprocess.check_output只获取stderr输出

时间:2016-09-12 09:30:11

标签: python python-2.7 subprocess stderr

我想在python中运行外部进程,并仅处理其stderr

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

2 个答案:

答案 0 :(得分:4)

不幸的是你已经标记了这个,就像在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(),其python版本低于3.5。在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

如果使用管道传递,则将输入发送到stdin,并从stdout和stderr读取,直到到达文件末尾。

答案 1 :(得分:0)

我发现了一个简单的伎俩:

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

这将过滤掉stdout,并仅保留stderr。