在调试器

时间:2016-03-24 16:00:01

标签: python debugging

是否可以设置我的调试器,使其在调试的应用程序生成下一个控制台输出时中断?

我的应用程序正在打印一个奇怪的字符串,我需要弄清楚它来自哪里。搜索源代码发现太多可能的候选者,字符串非常通用。

2 个答案:

答案 0 :(得分:4)

如果您使用的是Python 3,只需定义一个自定义print函数,该函数通过__builtins__调用原始函数,并在该自定义函数中设置断点。在没有修改任何其他内容的情况下,代码将调用它而不是原始代码:

def print(*args, **kwargs):
    # set debugger breakpoint here
    __builtins__.print(*args, **kwargs)

# your code below can use print() normally

当您完成调试时,只需再次删除或评论该覆盖功能。

答案 1 :(得分:2)

Python 2.x 中,您可以通过将sys.stdout替换为满足文件接口的对象来进行拦截打印语句(想想鸭子打字)。一个简单的开始:

import inspect
import sys

class OutputHook(object):
    def __init__(self, stdout):
        self._stdout = stdout

    def write(self, text):
        frame = inspect.currentframe(1)
        try:
            class_name = frame.f_locals['self'].__class__.__name__ + "."
        except KeyError:
            class_name = ""
        self._stdout.write("writing to sys.stdout at "
                           "{}{}() in line {}:\n{}\n".format(
                               class_name,
                               frame.f_code.co_name,
                               frame.f_lineno,
                               repr(text)))

def test():
    print "BBB"

class Test:
    def bla(self):
        print "Hello"

sys.stdout = OutputHook(sys.stdout)

print "aaa"
test()
Test().bla()

您将获得输出:

writing to sys.stdout at <module>() in line 33:
'aaa'
writing to sys.stdout at <module>() in line 33:
'\n'
writing to sys.stdout at test() in line 25:
'BBB'
writing to sys.stdout at test() in line 25:
'\n'
writing to sys.stdout at Test.bla() in line 29:
'Hello'
writing to sys.stdout at Test.bla() in line 29:
'\n'

您可以添加一个检查,如果书面文本是您的模式并启动调试器,或者只是中断,例如:

if text.startwith("funny"):
    pdb.set_trace()