5

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

有没有办法初始化一个侦听器循环,在某个组合键下,无论它当前在哪里,它都会让我进入代码中?想想 CTRL+Z,但把我留在 Python 而不是 Bash 中。

4

2 回答 2

7

您可以使用信号模块设置一个处理程序,该处理程序将在您按下 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 模块中间停下来。udpdbc

于 2012-04-21T02:30:02.610 回答
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())
于 2012-04-21T11:11:48.953 回答