退出Python调试器ipdb

时间:2015-08-17 16:13:11

标签: python debugging workflow exit ipdb

我经常使用ipdb,只是跳转到 isolated 的一段代码,即很难编写使用它的真实脚本。相反,我用模拟编写了一个最小的测试用例并跳转到它。

工作流程的示例:

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的挫败感最终也会退出终端)。

是否有一种强制戒烟的聪明方法?这个工作流程是否合理?这样做的标准方法是什么?

6 个答案:

答案 0 :(得分:40)

我在我的.pdbrc

中添加了以下内容
import os

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

kk杀死调试器和(触发调试器的过程)。

答案 1 :(得分:39)

以下对我有用:

import sys
sys.exit()

在上面和下面提到的更新版本的ipython中,这不起作用。 在那种情况下,

import os
os._exit(0)

应该仍然可以做到。

答案 2 :(得分:7)

最新版本的IPython 5.1.0存在问题。您可以使用以下代码检查您的环境:

pip freeze | egrep -i '^i'

它将通过降级到IPython == 5.0.0来解决。

pip install ipython==5.0.0

这适合我。

答案 3 :(得分:7)

正如另一个答案中所提到的,这是IPython 5.1中的一个错误。它已在this pull request中修复,不再是IPython 5.2及其后的问题。您现在可以使用qquit() Ctrl + d 退出调试器。

答案 4 :(得分:0)

草率但有效的方法是设置猴子补丁ipdb.set_trace = lambda:0,然后每次击打ipdb.set_trace时,它将什么都不做,并返回到调用函数。因此,您无需再输入q

答案 5 :(得分:0)

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

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