如何在事后调试中退出ipdb?

时间:2016-08-23 00:52:04

标签: python ipython pdb ipdb

我喜欢使用以下方法检查Python脚本中的错误:

$ python3 -m pdb my_script.py

这使我进入pdb提示符,我可以c继续执行,当它遇到错误时,我可以检查变量然后q退出脚本执行以返回到我的外壳

我尝试使用iPython调试器模块,因为它更加丰富多彩:

$ python3 -m ipdb my_script.py

但是,一旦检查完错误,我就无法退出调试器。使用q quit命令只需在重新执行脚本和事后模式之间切换:

$ python3 -m ipdb my_script.py
ipdb> c
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
ipdb> Inspect some variables at this point
ipdb> q
Post mortem debugger finished. The my_script.py will be restarted
ipdb> q
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
ipdb> q
Post mortem debugger finished. The my_script.py will be restarted
ipdb> q
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
ipdb> q
Post mortem debugger finished. The my_script.py will be restarted
ipdb> q
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program

如何退出此调试器?

3 个答案:

答案 0 :(得分:26)

正如用户@ffeast评论的那样,有an open ipdb issue,并建议了一些解决方法。对我来说,这些效果很好:

  • ctrl + z kill %1(或任何作业编号)
  • 执行ipdb> import os; os._exit(1)

答案 1 :(得分:6)

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

答案 2 :(得分:0)

使用 ctrl + z (或第二个终端),并 杀死进程

  1. 打开第二个终端:

    • 选项A :按 ctrl + z
    • 选项B :如果您可以访问Ubuntu GUI ,请打开第二个终端( ctrl + alt + t
    • 选项C :如果您只能访问命令行,请访问第二个tty( ctrl + alt + F2
    • 选项D :如果您正在通过ssh 访问服务器,请从另一个终端ssh server建立新连接(使用选项B或C,因此您可以打开第二个连接来执行命令)

:(如果 ctrl + z 不起作用,则可以打开第二个终端)

  1. 在进程PID中查找相应的Python ps -ax | grep python。例如,我的流程(python my_stucked_process.py)的流程ID为112923
   3085 tty1     Sl+   15:53 /usr/bin/python /usr/bin/x-terminal-emulator
   112923 pts/2    Tl     0:01 python my_stucked_process.py
   113118 pts/2    S+     0:00 grep --color=auto python
  1. 杀死进程kill -9 112923

@tutuDajuju建议使用 ctrl + z ,但是他们的建议只会将进程发送到后台(它仍然会消耗内存)。您需要执行上述操作才能真正终止进程