Я написал небольшой скрипт 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()
Любые идеи?
os.execvp
, а дескриптор stdout — это что-то волшебное. Итак, я создал подкласс Popen, но он игнорирует тот факт, что ему были переданы завернутые файлы и карта fd:title. - person TryPyPy   schedule 28.01.2011