退出 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 及更高版本开始不再是问题。您现在可以使用 q
、quit()
或 Ctrl+d 退出调试器。
草率但有效的方法是设置猴子补丁ipdb.set_trace = lambda:0
,然后每次后续ipdb.set_trace
被击中它什么都不做,return到调用函数。这样您就不必再输入 q
。
我发现这些解决方案只能成功破坏您的内核,然后您必须重新启动并重新加载所有内容。
我遇到的问题是在 for 循环中 q
将继续进行下一次迭代,而不是退出循环。最终我发现它只有在你的 for
循环在 try
语句中时才会发生。删除 try
并且您可以再次退出调试器而不继续 for
循环。
我经常使用 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 及更高版本开始不再是问题。您现在可以使用 q
、quit()
或 Ctrl+d 退出调试器。
草率但有效的方法是设置猴子补丁ipdb.set_trace = lambda:0
,然后每次后续ipdb.set_trace
被击中它什么都不做,return到调用函数。这样您就不必再输入 q
。
我发现这些解决方案只能成功破坏您的内核,然后您必须重新启动并重新加载所有内容。
我遇到的问题是在 for 循环中 q
将继续进行下一次迭代,而不是退出循环。最终我发现它只有在你的 for
循环在 try
语句中时才会发生。删除 try
并且您可以再次退出调试器而不继续 for
循环。