我喜欢使用以下命令检查Python脚本中的错误:
$ python3 -m pdb my_script.py
这会让我进入一个pdb提示符,从那里我可以c
继续执行,当它遇到错误时,我可以检查变量,然后q
退出脚本执行以回到我的shell。
我尝试了同样的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
如何退出这个调试器?
正如用户@ffeast评论的那样,存在一个开放的ipdb问题,并建议了一些解决方法。对我来说,这些很有效:
- 按ctrl+z和
kill %1
(或任何作业编号) - execute
ipdb> import os; os._exit(1)
这是ippython 5.1中的一个错误。它在这个pull request中被修复了,并且不再是ipython5.2及以后的问题。您现在可以使用q
、quit()
或Ctrl+d退出调试器。
使用ctrl+z或打开第二个终端,然后查找进程(ps -ax | grep python
)并杀死进程
一步一步:
-
访问终端:
- 选择
- :按 ctrl + z
- 选项B:如果您可以访问Ubuntu GUI,打开第二个终端(ctrl+alt+t)
- 选项C:如果您只能访问命令行,则访问第二个tty (ctrl+alt+F2)
- 选项D:如果您正在通过ssh访问服务器,则从另一个终端
ssh server
(使用选项B或C,以便您可以打开第二个连接来执行命令)
-
查找进程
ps -ax | grep python
对应的pythonPID
。例如,我的进程(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
- 终止进程
kill -9 112923
@tutuDajuju建议使用ctrl+z,但他们的建议只会将进程发送到后台(它仍然存在消耗内存)。你需要按照上面的顺序来终止这个进程