2015-01-08 2 views
1

Я называю внешний двоичный с помощью модуля подпроцесс:Python подпроцессов Подавите стандартный вывод и стандартный поток ошибок

try: 
    subprocess.check_output([param1, param2], stderr=subprocess.STDOUT) 
except subprocess.CalledProcessError as e: 
    print(e.output) 

Это выводит ошибку как при check_output прогонов и в заявлении, за исключением. Я действительно хочу, чтобы напечатать вывод , только если я поймаю исключение. Итак, это означает, что я хочу иметь stderr в объекте исключения.

Проблема заключается в том, что если я подавить стандартный вывод:

subprocess.check_output(..., stdout=open(sys.os.devnull, 'wb')) 

Тогда e.output уверен, становится пустым. Также я попытался установить stderr в None - тот же эффект.

Как добавить stderr к экземпляру subprocess.CalledProcessError без перенаправления stderr к stdout, потому что мне не нужно stdout вообще.

+0

http://stackoverflow.com/questions/17352163/collecting-stderr-in-memory-with-subprocess-call –

+0

не печатать 'e.output' id, вы хотите только один раз увидеть ошибку:' subprocess.check_output ([param1, param2]) 'и использовать проход вместо печати –

+0

Это просто пример. В реальном приложении я делаю повторное исключение, которое затем используется для создания jsonified сообщения об ошибке. – Glueon

ответ

2

check_output - функция удобства с ограниченной функциональностью. Если он не делает то, что вы хотите, свернуть свой собственный:

proc = subprocess.Popen([param1, param2], 
    stderr=subprocess.PIPE) 
out, err = proc.communicate() 
if proc.returncode != 0: 
    print(err) 
+0

Насколько я понимаю, в случае ненулевого кода возврата check_output вызовет исключение, и я никогда не получу часть 'print (err)'. – Glueon

+0

Кажется, вы подражаете 'subprocess.Popen'у instprocess.check_output'. Я думал, что это можно сделать с помощью check_output по умолчанию. Просто подавляйте stdout и имеете stderr в исключении. Странный .. – Glueon

Смежные вопросы

 Смежные вопросы