Почему IPython не вызывает sys.stderr.flush ()? - PullRequest
1 голос
/ 18 сентября 2019

Я использую модуль Python logging и перенаправляю stderr в файл журнала, перезаписывая sys.stderr экземпляром этого класса ...

# Redirect stderr to main_logger using this class
    class CustomWriter:
        def __init__(self, logger, level):
            self.buffer = ''
            self.logger = logger
            self.level = level

        def write(self, message):
            self.buffer += message

        def flush(self):
            if self.buffer != '':
                for line in self.buffer.split('\n'):
                    self.logger.log(self.level, line)
                self.buffer = ''

Работает нормально, когда я запускаюмой код как скрипт, но он ничего не регистрирует, когда я запускаю тот же код в интерактивном режиме с использованием IPython, я думаю, потому что IPython никогда не вызывает метод flush() для sys.stdout, как показано ниже.

import sys
sys.stderr.flush = lambda: print("flushed")
raise Exception("This is a test")

Приведенный выше код при запуске в виде скрипта ...

Traceback (most recent call last):
flushed
  File "C:/_MyFiles/Projects/git_projects/fto-util/scratch.py", line 3, in <module>
flushed
    raise Exception("This is a test")
flushed
Exception: This is a test
flushed

Process finished with exit code 1

При запуске в интерактивном режиме с ванильным Python ...

>>> import sys
>>> sys.stderr.flush = lambda: print("flushed")
flushed
>>> raise Exception("This is a test")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception: This is a test
flushed

С IPython ...

In [1]: import sys
In [2]: sys.stderr.flush = lambda: print("flushed")
In [3]: raise Exception("This is a test")
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
<ipython-input-3-f2b5a8ce26d8> in <module>
----> 1 raise Exception("This is a test")

Exception: This is a test

Делает ли IPython что-то здесь непростое или я просто делаю неверное предположение о том, как sys.stderr должен себя вести?Как мне это исправить?

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