30

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

$ python3 -m pdb my_script.py

这让我进入一个 pdb 提示符,我可以从那里c继续执行,当它遇到错误时,我可以检查变量然后q退出脚本执行以返回我的 shell。

我对 iPython 调试器模块进行了同样的尝试,因为它更加丰富多彩:

$ python3 -m ipdb my_script.py

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

$ 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

如何退出这个调试器?

4

3 回答 3

39

正如用户@feast 评论的那样,存在一个开放的 ipdb 问题,并建议了一些解决方法。对我来说,这些效果很好:

  • ctrl+zkill %1(或任何作业编号)
  • 执行ipdb> import os; os._exit(1)
于 2016-10-27T08:00:57.507 回答
10

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

于 2017-02-25T23:42:55.107 回答
2

使用ctrl+z或打开第二个终端,然后查找进程 ( ps -ax | grep python) 并终止进程

一步步:

  1. 访问终端:

    • 选项 A:按ctrl+z
    • 选项 B:如果您可以访问 Ubuntu GUI,请打开第二个终端( ctrl++ alt)t
    • 选项 C:如果您只能访问命令行,请访问第二个tty ( ctrl++ alt)F2
    • 选项 D:如果您通过 ssh 访问服务器,请从另一个终端建立新连接ssh server(使用选项 B 或 C,以便您可以打开第二个连接以执行命令)
  2. 寻找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但他们的建议只会将进程发送到后台(它仍然存在消耗内存)。您需要执行上述操作才能真正杀死该进程

于 2019-03-08T09:43:12.337 回答