Это хорошее решение, но оно хранит stdout \ stderr в стороне до завершения процесса, а затем записывает их в файл журнала. Это означает, что временные метки указывают время регистрации, а не время событий, и теряют порядок событий (все сообщения стандартного вывода записываются, а затем записываются все сообщения стандартного ввода).

ал небольшой скрипт Python, который выполняет некоторые команды оболочки, используяsubprocess модуль и вспомогательная функция:

import subprocess as sp
def run(command, description):
    """Runs a command in a formatted manner. Returns its return code."""
    start=datetime.datetime.now()
    sys.stderr.write('%-65s' % description)
    s=sp.Popen(command, shell=True, stderr=sp.PIPE, stdout=sp.PIPE)
    out,err=s.communicate()
    end=datetime.datetime.now()
    duration=end-start
    status='Done' if s.returncode==0 else 'Failed'
    print '%s (%d seconds)' % (status, duration.seconds)

Следующие строки читают стандартный вывод и ошибку:

    s=sp.Popen(command, shell=True, stderr=sp.PIPE, stdout=sp.PIPE)
    out,err=s.communicate()

Как видите, stdout и stderr не используются. Предположим, что я хочу записать выходные данные и сообщения об ошибках в файл журнала в отформатированном виде, например:

[STDOUT: 2011-01-17 14:53:55] <message>
[STDERR: 2011-01-17 14:53:56] <message>

У меня вопрос, какой самый Pythonic способ сделать это? Я думал о трех вариантах:

Унаследовать объект файла и переопределитьwrite метод.Используйте класс Delegate, который реализуетwrite.Подключиться кPIPE сам в некотором роде.

ОБНОВЛЕНИЕ: эталонный тестовый скрипт

Я проверяю результаты с помощью этого скрипта, сохраненного какtest.py:

#!/usr/bin/python
import sys

sys.stdout.write('OUT\n')
sys.stdout.flush()
sys.stderr.write('ERR\n')
sys.stderr.flush()

Есть идеи?

Ответы на вопрос(5)

Ваш ответ на вопрос