33

I like to inspect error in a Python script by using:

$ python3 -m pdb my_script.py

This drops me into a pdb prompt from where I can c continue the execution, and when it hits error, I can inspect the variables and then q quit the script execution to get back to my shell.

I tried the same with iPython debugger module, since it is more colorful:

$ python3 -m ipdb my_script.py

However, I am not able to quit the debugger once I am done inspecting the error. Using the q quit command just keeps switching it between re-executing the script and post-mortem mode:

$ 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

How to quit this debugger?

Ashwin Nanjappa
  • 76,204
  • 83
  • 211
  • 292

3 Answers3

43

As the user @ffeast commented, there is an open ipdb issue, and a few workarounds suggested. For me these worked well:

  • press ctrl+z and kill %1 (or whatever the Job number is)
  • execute ipdb> import os; os._exit(1)
tutuDajuju
  • 10,307
  • 6
  • 65
  • 88
  • 2
    `ctrl+z` won't really exit the process, it just sends it to the background. For example, you can get back into the debugger by using the command `fg 1`, you will see the debugger is still there. The second one `import os; os._exit(1)` worked in my case. – toto_tico Mar 08 '19 at 09:24
  • True, updated answer with a follow up to kill bg process. – tutuDajuju Mar 08 '19 at 09:55
  • Can `import os; os._exit(1)` be set to an alias within `ipdb`? – alper Jun 20 '21 at 11:35
11

This was a bug in IPython 5.1. It was fixed in this pull request and is no longer an issue from IPython 5.2 and onwards. You can now use q, quit(), or Ctrl+d to exit the debugger.

joelostblom
  • 43,590
  • 17
  • 150
  • 159
2

Use ctrl+z or open a second terminal, then look for the process (ps -ax | grep python) and kill the process.

Step by Step:

  1. Get access to a terminal:

    • Option A: Press ctrl+z
    • Option B: If you have access to a the Ubuntu GUI, open a second terminal (ctrl+alt+t)
    • Option C: If you only have access to a command line, access a second tty (ctrl+alt+F2)
    • Option D: If you are accessing a server through ssh, make a new connection from another terminal ssh server (use option B or C, so you can open a second connection to execute the command)
  2. Look for the corresponding python PID of the process ps -ax | grep python. For example, the process id for my process (python my_stucked_process.py) would be 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 the process kill -9 112923

@tutuDajuju suggested using ctrl+z but their suggestion will only send the process to the background (it will still exists consuming memory). You need to do the abovein order to really kill the process

toto_tico
  • 17,977
  • 9
  • 97
  • 116