随时可以在Python中使用解释器

时间:2012-04-21 02:13:03

标签: python debugging

我知道如何使用pdbIPython加入翻译,但这需要我事先知道我想要停止的地方。但是,我经常运行需要几分钟到几小时的数字运算脚本,我想确切地知道它的进展是什么。一个解决方案是简单地在任何地方放置大量的日志记录语句,但是我要么用太多的信息淹没自己,要么无法准确记录我想知道的内容。

有没有办法初始化一个监听器循环,在某个键组合下会将我放入代码中的任何位置?想想CTRL + Z,但留下我的是Python,而不是Bash。

2 个答案:

答案 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+\跳转到代码,使用ud检查堆栈,与正常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())