Не могу найти печать 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__ чтобы избежать петель.

Другие вопросы по тегам