2013-06-13 1 views
3

Просто хотел забрать ваши мозги. У меня есть несколько подпроцессов, и я хотел напечатать stderr и stdout в файле. Я сделал это до сих пор:python log stderr и stdout к файлу

def write_to_stderr_log(process): 
    stderr= open("stderr.log", "w") 
    proc_err = process.communicate() 
    print >> stderr, proc_err 
    stderr.close() 

def write_to_stdout_log(process): 
    stdout = open("stdout.log", "w") 
    proc_out = process.communicate() 
    print >> stdout, proc_out 
    stdout.close() 

def logger(): 
    logger = logging.getLogger('error_testing') 
    hdlr = logging.FileHandler('error.log') 
    formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') 
    hdlr.setFormatter(formatter) 
    logger.addHandler(hdlr) 
    logger.setLevel(logging.WARNING) 

    logger.error('We have a problem') 
    logger.debug('debugging') 
    logger.info('some info') 

logger() 
proc = subprocess.Popen(['FastTree -nt test.fasta'], bufsize=512, stdin = None, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell=True) 

write_to_stderr_log(proc) 
write_to_stdout_log(proc) 

Это лучший способ сделать это. Если у меня есть несколько процессов, я думаю, что он собирается перезаписать файлы журнала, так что это может быть проблемой. Оцените здесь несколько советов. Спасибо

+0

@nrpeterson это один из перенаправлений вывода дочернего процесса –

+0

А, у вас есть точка. Мои извинения! –

ответ

0

Я уверен, что вы можете предоставить свои собственные file экземпляров в качестве ключевых слов для subprocess.Popen.

>>> out = open('stdout.log', 'wb') 
>>> err = open('stderr.log', 'wb') 
>>> child = subprocess.Popen('FastTree -nt test.fasta', stdin=None, stdout=out, 
          stderr=err) 
>>> rc = child.wait() 
>>> out.close() 
>>> err.close() 

Вот часть subprocess.Popen документов, имеет значение:

STDIN, стандартных вывод и STDERR указать стандартный ввод Выполненных программ, стандартный вывод и стандартные дескрипторы файлов ошибок, соответственно , Допустимые значения: PIPE, DEVNULL, существующий файловый дескриптор (положительное целое число), существующий файл и None. PIPE указывает, что должен быть создан новый канал для ребенка. DEVNULL указывает, что будет использоваться специальный файл os.devnull. При настройках по умолчанию None перераспределение не произойдет; обработчики файлов ребенка будут унаследованы от родителя. Кроме того, stderr может быть STDOUT, что указывает на то, что данные из приложений должны быть записаны в один и тот же дескриптор файла, что и для stdout.

+0

Это не сработало. Если я введу ошибку в подпроцессе FastTree, ничего не будет напечатано в файле stderr.log. – bioinf80

+0

Попробуйте добавить 'shell = True', хотя я сомневаюсь, что это будет иметь какой-то эффект. –

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

  • Нет связанных вопросов^_^