Python 如何在事后调试时退出ipdb?

Python 如何在事后调试时退出ipdb?,python,ipython,pdb,ipdb,Python,Ipython,Pdb,Ipdb,我喜欢使用以下方法检查Python脚本中的错误: $ python3 -m pdb my_script.py 这会让我进入pdb提示符,从那里我可以c继续执行,当它出现错误时,我可以检查变量,然后q退出脚本执行以返回shell 我对iPython调试器模块进行了相同的尝试,因为它更丰富多彩: $ python3 -m ipdb my_script.py 但是,一旦检查完错误,我就无法退出调试器。使用qquit命令可以在重新执行脚本和事后模式之间切换: $ python3 -m ipdb my

我喜欢使用以下方法检查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评论的那样,有一些建议的解决方法。对我来说,这些很有效:

  • 按ctrl+z并
    kill%1
    (或任何作业编号)
  • 执行
    ipdb>导入操作系统;操作系统退出(1)

    • 这是IPython 5.1中的一个bug。它已在中修复,从IPython 5.2及以后不再是问题。您现在可以使用
      q
      quit()
      或Ctrl+d退出调试器。

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

      逐步:

    • 访问终端:

      • 选项A:按ctrl+z
      • 选项B:如果您可以访问Ubuntu GUI中的一个终端,请打开第二个终端(ctrl+alt+t)
      • 选项C:如果您只能访问命令行,请访问第二个tty(ctrl+alt+F2)
      • 选项D:如果您通过ssh访问服务器,请从另一个终端建立新连接
        ssh服务器
        (使用选项B或C,以便打开第二个连接以执行命令)
    • 查找进程
      ps-ax | grep python
      的相应python
      PID
      。例如,我的进程的进程id(
      python my_stucked_process.py
      )将是
      112923

    • 终止进程
      Kill-9 112923


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

      ^C或^D不起作用吗?我偶尔也会遇到类似的情况,我不得不多次尝试exit@spruceb那也不行!可能与你的ipython版本重复?这个问题在ipython==5.1.1中重现。查看此评论:^Z也不起作用。ipdb捕获它并显示
      ^Z
      ctrl+Z
      不会真正退出进程,它只是将其发送到后台。例如,您可以使用命令
      fg 1
      返回调试器,您将看到调试器仍然存在。第二个
      导入操作系统;os._exit(1)
      在我的情况下起作用。正确,更新的答案带有后续的终止bg进程。退出操作似乎比使用
      pdb
      本身慢。这是正常情况吗?退出调试器对我来说是立竿见影的。
         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