我经常使用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的挫败感最终也会退出终端)。
是否有一种强制戒烟的聪明方法?这个工作流程是否合理?这样做的标准方法是什么?
答案 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及其后的问题。您现在可以使用q
,quit()
或 Ctrl + d 退出调试器。
答案 4 :(得分:0)
草率但有效的方法是设置猴子补丁ipdb.set_trace = lambda:0
,然后每次击打ipdb.set_trace
时,它将什么都不做,并返回到调用函数。因此,您无需再输入q
。
答案 5 :(得分:0)
我发现这些解决方案只能成功破坏内核,然后您必须重新启动并重新加载所有内容。
我在for循环q
中遇到的问题将继续进行下一次迭代,而不是退出循环。最终,我发现只有在您的for
循环位于try
语句中时,它才会发生。删除try
,您可以再次退出调试器,而无需继续进行for
循环。