在python smtpd中找不到stderr print。



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

所以如果我在process_message:中这样做

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

我看到

550, This is the error

在控制台上。我一辈子都找不到是什么代码导致了打印。是否有任何方法可以覆盖stderr,以便在每次打印内容时显示堆栈跟踪,或者以其他方式定位打印这些行的代码行?

您可以用跟踪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("triggern")
sys.stderr.flush()

请注意,我使用__stderr__来避免循环。

最新更新