Не могу найти печать stderr в python smtpd
Я использую smtpd и его ловлю исключения ValueError, которые я поднимаю в process_message, и печатаю описание в stderr вместо того, чтобы выдавать ошибку. Он выводит строку, с которой я создаю ошибку ValueError.
Так что, если я сделаю это в process_message:
raise ValueError("550, This is the error")
я вижу
550, This is the error
на консоли. Я не могу за всю жизнь найти, какой код вызывает печать. Есть ли способ переопределить stderr для отображения трассировки стека каждый раз, когда что-то печатается, или иным образом определить, какие строки кода выводят эти строки?
1 ответ
Решение
Вы можете заменить один стандартный поток вывода чем-то, что отслеживает вызовы write()
:
import sys
import traceback
class FileTracer(object):
def __init__(self, out):
self.out = out
def write(self, data):
traceback.print_stack(None, None, sys.__stderr__)
self.out.write(data)
def flush(self):
self.out.flush()
def close(self):
self.out.close()
sys.stderr = FileTracer(sys.stderr)
sys.stderr.write("trigger\n")
sys.stderr.flush()
Обратите внимание, что я использую __stderr__
чтобы избежать петель.