Есть python скрипт:
import sys
sys.stdout = open('my_log.log', 'w')
print 'test'
Он пишет весь стандартный вывод в файл. Вопрос: как мне и писать в файл, и одновременно выводить на консоль?
Ответ
Как наколеночное решение, буквально выполняющее задачу, озвученную в вопросе: можно создать класс, который принимает два файловых объекта, и при записи в объект данного класса выполнять запись в оба файловых объекта.
import sys
class DoubleWrite:
def __init__(self, file1, file2):
self.file1 = file1
self.file2 = file2
def write(self, s):
self.file1.write(s)
self.file2.write(s)
def flush(self):
self.file1.flush()
self.file2.flush()
logfile = open('my_log.log', 'w')
sys.stdout = DoubleWrite(sys.stdout, logfile)
print "test"
В целом, для логирования рекомендуется использовать уже существующие решения, в частности модуль logging
Обновление.
Для корректного перенаправления и последующего восстановления sys.stdout в Python 3 лучше использовать менеджер контекста contextlib.redirect_stdout. В стандартной библиотеке Python 2 такого менеджера контекста, к сожалению, нет.
Пример использования (для Python 3):
import sys
from contextlib import redirect_stdout
class DoubleWrite:
...
with open('my_log.log', 'w') as logfile:
with redirect_stdout(DoubleWrite(sys.stdout, logfile)):
print('test')
После выхода из блока with redirect_stdout(...) значение sys.stdout восстановится.
Комментариев нет:
Отправить комментарий