我知道如何使用 and 进入解释器pdb
,IPython
但这需要我事先知道我想在哪里停下来。但是,我经常运行需要几分钟到几小时的数字运算脚本,我想确切地知道它的进度。一种解决方案是简单地将大量的日志记录语句放在任何地方,但是我要么用太多的信息淹没自己,要么无法准确地记录我想知道的内容。
有没有办法初始化一个侦听器循环,在某个组合键下,无论它当前在哪里,它都会让我进入代码中?想想 CTRL+Z,但把我留在 Python 而不是 Bash 中。
您可以使用信号模块设置一个处理程序,该处理程序将在您按下 control-C 或 control-Z 或其他任何东西时启动调试器.. SIGINTR,SIGSUSP。
例如,定义一个instant_debug.py
覆盖 SIGQUIT 的模块,
import signal
import pdb
def handler(signum, frame):
pdb.set_trace()
signal.signal(signal.SIGQUIT, handler)
然后编写脚本
import instant_debug
import time
for i in xrange(1000000):
print i
time.sleep(0.1)
在执行过程中的任何时候,您都可以通过键入 跳入代码,用和正常CTRL+\
检查堆栈,然后继续进行,就好像什么都没发生过一样。请注意,您只会在下一个“原子”操作结束时加入——这意味着不会在一个巨大的 C 模块中间停下来。u
d
pdb
c
你可以这样做
def main():
i = 1000
while True:
print "Count Down %s" % i
time.sleep(1)
i -= 1
try:
main()
except KeyboardInterrupt:
pass # Swallow ctrl-c
finally:
code.interact("Dropped into interpreter", local=globals())