我正在调试一个大的Python代码库.在某个地方,一段代码正在打印到控制台,可能这是一些旧的调试代码,它是偶然留下的.
由于这是唯一没有通过记录器的控制台输出,有什么办法可以找到罪魁祸首吗?也许通过重新定义print语句的作用,我可以引发异常?
尝试重定向sys.stdout到自定义流处理程序(请参阅将stdout重定向到Python中的文件?),您可以在其中覆盖write()方法.
尝试这样的事情:
import io
import sys
import traceback
class TestableIO(io.BytesIO):
def __init__(self, old_stream, initial_bytes=None):
super(TestableIO, self).__init__(initial_bytes)
self.old_stream = old_stream
def write(self, bytes):
if 'bb' in bytes:
traceback.print_stack(file=self.old_stream)
self.old_stream.write(bytes)
sys.stdout = TestableIO(sys.stdout)
sys.stderr = TestableIO(sys.stderr)
print('aa')
print('bb')
print('cc')
Run Code Online (Sandbox Code Playgroud)
然后你会得到很好的追溯:
? python test.py
aa
File "test.py", line 22, in <module>
print('bb')
File "test.py", line 14, in write
traceback.print_stack(file=self.old_stream)
bb
cc
Run Code Online (Sandbox Code Playgroud)