Невозможно восстановить стандартный вывод (только для терминала) - PullRequest
8 голосов
/ 08 января 2012

Мне нужно вывести все мои операторы печати как в терминал, так и в файл. Я нашел решение в этом вопросе stackoverflow Поэтому я использую

class Tee(object): 
    def __init__(self, name): 
        self.file = open(name, "a") 
        self.stdout = sys.stdout 
        sys.stdout = self 
    def __del__(self): 
        sys.stdout = self.stdout 
        self.file.close() 
    def write(self, data): 
       self.file.write(data) 
       self.stdout.write(data)

sys.stdout = Tee("log.txt")

Это прекрасно работает,

Моя проблема - когда я хочу прекратить запись в файл и вернуться к нормальной работе, которая выполняется только для терминала
Я попытался использовать del (sys.stdout) для вызова метода del , но безуспешно.
я даже пытался изменить последнюю строку на:

    multiple_print = Tee("log.txt")
    sys.stdout = multiple_print

, а затем использовать del (множественный_принт) и не удалось

Независимо от того, что я пробовал, дальнейшее использование print все еще записывается в терминал и в файл обоих.

Есть идеи?

1 Ответ

14 голосов
/ 08 января 2012

Перед переназначением необходимо сохранить ссылку на исходный дескриптор файла:

oldstdout = sys.stdout

, а затем переназначить ее на sys.stdout!

Инструкция del неВызовите __del__ напрямую, но уменьшите счетчик ссылок вашего объекта.метод __del__ вызывается, если счетчик ссылок достигает нуля и ваш объект вот-вот разрушится.Таким образом, вы не можете принудительно переназначить, потому что сборщик мусора должен вызывать ваш метод __del__.

Вам необходимо напрямую переназначить переменную sys.stdout:

Попробуйте:

sys.stdout = sys.__stdout__
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...