在Python中的任何时候都可以访问解释器

在Python中的任何时候都可以访问解释器,python,debugging,Python,Debugging,我知道如何使用pdb和IPython进入解释器,但这需要我事先知道我想停在哪里。然而,我经常运行需要数分钟到数小时的数字运算脚本,我想知道它的具体进展情况。一种解决方案是在任何地方都放置大量的日志语句,但我要么用太多的信息淹没自己,要么无法准确地记录我想知道的内容 有没有一种方法可以初始化一个侦听器循环,在某个键组合下,它会将我放入代码中,无论它当前在哪里?考虑CTRL+Z,但将我留在Python中,而不是Bash中。您可以使用设置一个处理程序,当您点击control-C或control-Z或其

我知道如何使用
pdb
IPython
进入解释器,但这需要我事先知道我想停在哪里。然而,我经常运行需要数分钟到数小时的数字运算脚本,我想知道它的具体进展情况。一种解决方案是在任何地方都放置大量的日志语句,但我要么用太多的信息淹没自己,要么无法准确地记录我想知道的内容

有没有一种方法可以初始化一个侦听器循环,在某个键组合下,它会将我放入代码中,无论它当前在哪里?考虑CTRL+Z,但将我留在Python中,而不是Bash中。

您可以使用设置一个处理程序,当您点击control-C或control-Z或其他命令时,该处理程序将启动调试器。。SIGINTR,sigsup

例如,定义一个覆盖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+\
跳入代码,像在正常
pdb
中一样,使用
u
d
检查堆栈,然后继续使用
c
,就好像什么都没有发生一样。注意,你只会在下一个“原子”操作的末尾跳进去——这意味着在一个巨大的C模块中间没有停止。

< P>你可以这样做< /P>
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())

问题是,你们是如何在windows上做到这一点的?我非常尊敬Duckworth的编辑,他将我简洁的答案扩展成了一个完整的好答案。我希望有一种方法来重新定位我为你赢得的积极声誉。由于缺乏这一点,我将此后续评论留给这个问题的未来读者——Duckworth回答得比我好。尊敬。@Jakob Bowyer:signal.CTRL_C_事件,请查看我回答中的信号模块链接。有几个特定于Windows的信号,你可以等待,这将完成工作。