38

我经常使用 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 最终也会退出终端的额外挫败感)。

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

4

6 回答 6

53

以下对我有用:

import sys
sys.exit()

在较新版本的 ipython 上,如上文和下文所述,这不起作用。在这种情况下,

import os
os._exit(0)

应该仍然可以解决问题。

于 2016-06-13T14:52:59.127 回答
43

我把以下内容放在我的.pdbrc

import os

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

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

于 2015-08-19T12:53:42.720 回答
7

正如另一个答案中提到的,这是 IPython 5.1 中的一个错误。它已在此拉取请求中得到修复,并且不再是 IPython 5.2 及更高版本的问题。您现在可以使用qquit()Ctrl+d退出调试器。

于 2017-02-25T23:41:44.667 回答
7

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

pip freeze | egrep -i '^i'

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

pip install ipython==5.0.0

这对我行得通。

于 2016-09-17T00:44:43.820 回答
0

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

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

于 2020-10-29T23:50:56.240 回答
0

马虎但有效的方法是设置猴子补丁ipdb.set_trace = lambda:0,然后每次ipdb.set_trace被击中它都会什么都不做并返回调用函数。所以你不必再打字q了。

于 2020-07-19T03:50:16.730 回答