是否可以设置我的调试器,使其在调试的应用程序生成下一个控制台输出时中断?
我的应用程序正在打印一个奇怪的字符串,我需要弄清楚它来自哪里。搜索源代码发现太多可能的候选者,字符串非常通用。
答案 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()