退出 Python 调试器 ipdb

Exiting Python Debugger ipdb

我经常使用 ipdb 来跳转到 孤立的 的一段代码,即很难编写使用它的真实脚本。相反,我编写了一个带有模拟的最小测试用例并跳入其中。

工作流程示例:

def func():
   ...
   import ipdb
   ipdb.set_trace()
   ...

def test_case():
    ...
    func()
    ...

然后,调用

py.test test_file.py -s -k test_case

现在,通常我只检查一两个变量,然后就想退出。改个代码再做一遍

我该如何退出?手册说 q 退出调试器。它没有(真的)。在调试器实际终止之前,您必须退出几次。 Ctrl-C 和 Ctrl-D 的行为相同(令人沮丧的是多次敲击 Ctrl-D 最终也退出了终端)。

是否有强制退出的聪明方法?这个工作流程是否明智?标准的做法是什么?

我将以下内容放入 .pdbrc

import os

alias kk os.system('kill -9 %d' % os.getpid())

kk 终止调试器和(触发调试器的进程)。

以下对我有用:

import sys
sys.exit()

在 ipython 的较新版本中,如上文和下文所述,这不起作用。 那样的话,

import os
os._exit(0)

应该还是可以的。

这是IPython5.1.0最新版本的问题。您可以使用以下代码检查您的环境:

pip freeze | egrep -i '^i'

降级到IPython==5.0.0.

会解决
pip install ipython==5.0.0

这对我有用。

如另一个答案中所述,这是 IPython 5.1 中的错误。它已在 this pull request 中修复,从 IPython 5.2 及更高版本开始不再是问题。您现在可以使用 qquit()Ctrl+d 退出调试器。

草率但有效的方法是设置猴子补丁ipdb.set_trace = lambda:0,然后每次后续ipdb.set_trace被击中它什么都不做,return到调用函数。这样您就不必再输入 q

我发现这些解决方案只能成功破坏您的内核,然后您必须重新启动并重新加载所有内容。

我遇到的问题是在 for 循环中 q 将继续进行下一次迭代,而不是退出循环。最终我发现它只有在你的 for 循环在 try 语句中时才会发生。删除 try 并且您可以再次退出调试器而不继续 for 循环。