我知道如何使用pdb
和IPython
加入翻译,但这需要我事先知道我想要停止的地方。但是,我经常运行需要几分钟到几小时的数字运算脚本,我想确切地知道它的进展是什么。一个解决方案是简单地在任何地方放置大量的日志记录语句,但是我要么用太多的信息淹没自己,要么无法准确记录我想知道的内容。
有没有办法初始化一个监听器循环,在某个键组合下会将我放入代码中的任何位置?想想CTRL + Z,但留下我的是Python,而不是Bash。
答案 0 :(得分:6)
您可以使用signal module设置一个处理程序,当您点击control-C或control-Z或其他任何东西时将启动调试器.SIGINTR,SIGSUSP。
例如,定义一个覆盖SIGQUIT的模块instant_debug.py
,
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+\
跳转到代码,使用u
和d
检查堆栈,与正常pdb
一样,然后继续c
好像什么也没发生过。请注意,您只会在下一次“原子”操作结束时跳转 - 这意味着不会在巨大的C模块中间停止。
答案 1 :(得分:1)
你可以这样做
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())