2013-09-12 3 views
5

У меня есть регистратор. что-то вроде этого:subprocess.call logger информация и ошибка для stdout и stderr соответственно

import logging 

logger = logging.getLogger('myApp') 
hdlr = logging.FileHandler('myApp.log') 
logger.addHandler(hdlr) 
logger.setLevel(logging.INFO) 

Я зову внешний процесс, как это:

subprocess.call("someCommand") 

Я хочу, чтобы захватить стандартный вывод и стандартный поток ошибок seperatly из этого процесса, так что я могу войти их acccordingly. Например,

logger.info(<stdout>) 
logger.error(<stderr>) 

Я вижу различные способы захвата всего подпроцесса в одном потоке. Но, если есть реальная ошибка, я хотел бы зарегистрировать ее как таковую. Есть ли способ сделать это?

ответ

16

Использование subprocess.Popen() и вызвать .communicate() на возвращенном объекте процесса:

p = subprocess.Popen(["someCommand"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
stdout, stderr = p.communicate() 

if stdout: 
    logger.info(stdout) 
if stderr: 
    logger.error(stderr) 
+0

Спасибо. Так легко. Еще одна причина, как Python –

+3

Это немного сокращается, когда stdout или stderr имеет много данных, поскольку '.communicate()' буферизует данные. Некоторые люди могут захотеть вызвать 'logger', как только строка будет доступна из любого из каналов. – Vegard

+0

Используйте 'subprocess32' с' bufsize'. –

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