在python smtpd中找不到stderr打印

时间:2013-07-23 09:34:26

标签: python smtpd

我正在使用smtpd及其捕获的ValueError异常,我在process_message中引发并将描述打印到stderr而不是引发错误。 打印出来的是我使用。

构造ValueError的字符串

所以,如果我在process_message中执行此操作:

raise ValueError("550, This is the error")

我看到了

550, This is the error
控制台上的

。 我不能为我的生活找到导致打印的代码。无论如何都要覆盖stderr以在每次打印某些内容时显示堆栈跟踪或以其他方式定位哪些代码行打印出这些行?

1 个答案:

答案 0 :(得分:2)

您可以使用跟踪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__来避免循环。