2016-09-12 4 views
1

Я хочу запустить внешний процесс в python и обработать его только stderr.Получить только вывод stderr из subprocess.check_output

Я знаю, что могу использовать subprocess.check_output, но как я могу перенаправить стандартный вывод в /dev/null (или игнорировать его любым другим способом), и получать только stderr?

+0

дубликат был неправильным, 'check_output' не разрешает переопределять' stdout'! –

+0

Есть ли причина, по которой вам это нужно только для Python 2.7? –

+0

, так что вы хотите поймать вывод в случае * ошибки * или * успеха * или обоих? –

ответ

3

К сожалению, вы отметили этот , как питон 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. Открыть /dev/null с помощью os.devnull в Python 2.7:

>>> 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 

Связь посылает вход в стандартный ввод, если по конвейеру, и не читает стандартный вывод и стандартный поток ошибок, пока не будет достигнут конец из файла.

+0

Спасибо за вашу помощь. Я нашел простой способ сделать это. – DevShark

0

Я нашел простой трюк:

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

Это будет отфильтровывать стандартный вывод, и сохраняет только поток ошибок.