Python调试,在特定outpu处停止

2024-04-27 03:37:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个复杂的python项目,有很多模块、记录器、twisted延迟器和其他东西。你知道吗

在代码的某个地方,有一行被打印到日志中,我想知道在哪里。通常我只是在代码库中搜索该字符串,但现在该字符串是动态生成的,因此不可搜索。你知道吗

我想知道是否有任何方法可以在调试模式下运行python,当sdout中出现某种模式时告诉它停止,然后在代码中打印它停止的位置?你知道吗


Tags: 模块项目方法字符串代码地方模式twisted
3条回答

您可以使用pdb module。 这将使您能够在运行时以交互方式调试代码。 您可以编写一个脚本,在读取日志文件中的那一行之前“一步一步”地运行您的程序。你知道吗

通过设置格式化程序,可以为每个日志记录包括路径名、模块、函数名和行号

formatter = logging.Formatter('[%(asctime)s] p%(process)s {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s','%m-%d %H:%M:%S')

替换sys.stdout怎么样?你知道吗

例如:

import sys
import traceback


class StacktraceOnPrint:

    def __init__(self, orig_stdout, substring):
        self.orig_stdout = orig_stdout
        self.substring = substring

    def write(self, txt):
        if self.substring in txt:
            traceback.print_stack() # OR  import pdb; pdb.set_trace()
        self.orig_stdout.write(txt)


sys.stdout = StacktraceOnPrint(sys.stdout, 'blah')
print 'test ...'
print 'Hello blah.'
print 'test ...'

注意^{}使用sys.stderr。如果您想捕获sys.stderr,请使用不同的函数(如^{})。否则它将永远重复;导致RuntimeError: maximum recursion depth exceeded。。你知道吗

相关问题 更多 >