Почему мой уважаемый метод sys.stdout.write () вызывается после того, как я его отключил? - PullRequest
0 голосов
/ 14 марта 2020

Я написал класс tee(), который перенаправляет стандартный вывод на терминал и в файл, основываясь на ответе Триптиха: .

. Работает первые пару раз. моя программа запускается, но в 3-й раз я получаю:

  File "C:\Users\Dave\data\Code\Python\lib\nerdlib.py", line 351, in write
    with open(self.name, "a",  encoding="utf-8") as f:

TypeError: expected str, bytes or os.PathLike object, not NoneType

Кажется, что даже после выполнения sys.stdout = self.old_stdout (восстановление вектора выполнения в том месте, с которого оно началось), каким-то образом мой метод записи все еще получает вызывают (в этом случае ожидается ошибка).

Но почему мой метод все еще вызывается?

Эта ошибка возникает в Spyder среда разработки - не уверен, что это связано.

Код ниже - достаточно просто.

1 Ответ

1 голос
/ 14 марта 2020

Опасность заключается в том, что установка sys.stdout = sys.old_stdout останавливает получение кода новым дескриптором при локальной замене, но не останавливает работу любого старого дескриптора.

В качестве надуманного примера:

class MyThread(threading.Thread):
    def __init__(self, log_dest=sys.stdout):
        self.log_dest = log_dest
    def run(self):
        # ...do something-or-other, and occasionally...
        self.log_dest.write('Hey, something happened')

Поскольку log_dest присваивается значение , когда MyThread был инициализирован , изменение sys.stdout к его старому значению не мешает он все еще пытается использовать ваш недействительный объект.

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