Я использую модуль 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
должен себя вести?Как мне это исправить?