随时在Python中进入解释器

5
我知道如何使用 pdbIPython 进入解释器,但这需要我事先知道我想要停止的确切位置。然而,我经常运行需要花费几分钟到几个小时的数据处理脚本,我想知道它的进度。一种解决方案是简单地在代码中添加大量的日志语句,但这样我要么陷入信息过载,要么无法记录我想要知道的内容。
有没有一种方法可以初始化一个监听器循环,在某些键组合下让我进入当前代码的位置?类似于CTRL+Z,但不是离开Python而是保持在其中。
2个回答

7
你可以使用 signal 模块 设置一个处理程序,当你按下 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+\来跳转到代码中,在普通的pdb中使用ud查看堆栈,然后像什么都没有发生一样继续使用c。请注意,您只能在下一个“原子”操作结束时跳入 - 这意味着不能在大型C模块的中间停止。


问题是,你如何在Windows上做到这一点? - Jakob Bowyer
1
非常尊重duckworthd的编辑,将我的简短回答扩展为完整且良好的回答。我希望有一种方法可以将我获得的积极声誉重新定向给你。由于缺乏这种方式,我留下这个后续评论,供未来读者参考 - duckworthd的回答比我更好。尊重。 - synthesizerpatel
@Jakob Bowyer:signal.CTRL_C_EVENT,可以在我的回复中查看signal模块链接。有几个特定于Windows的信号可以等待,可以完成这项工作。 - synthesizerpatel

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())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接