аватар question@mail.ru · 01.01.1970 03:00

Как писать в stdout и в файл одновременно?

Есть python скрипт:

import syssys.stdout = open('my_log.log', 'w')print 'test'

Он пишет весь стандартный вывод в файл. Вопрос: как мне и писать в файл, и одновременно выводить на консоль?

аватар answer@mail.ru · 01.01.1970 03:00

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

from __future__ import print_functionimport 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 лучше использовать менеджер контекста . В стандартной библиотеке Python 2 такого менеджера контекста, к сожалению, нет.

Пример использования (для Python 3):

import sysfrom contextlib import redirect_stdoutclass DoubleWrite:    ...with open('my_log.log', 'w') as logfile:    with redirect_stdout(DoubleWrite(sys.stdout, logfile)):        print('test')

После выхода из блока with redirect_stdout(...) значение sys.stdout восстановится.

Последние

Похожие