Is there any way to make a python program start an interactive debugger, like what import pdb; pdb.set_trace()
instead of actually throwing an exception?
I
If you are inside the REPL, you can do
import sys
import pdb
pdb.post_mortem(sys.last_traceback)
See https://docs.python.org/2/library/pdb.html and https://docs.python.org/3/library/traceback.html
This question is quite old, so this is mainly for future me
try:
...
except:
import traceback, pdb, sys
traceback.print_exc()
print ''
pdb.post_mortem()
sys.exit(1)
I wrote a package to start pdb on exception. It takes @boreis-gorelik's answer, and modifies the interpreter state at runtime so no code changes are necessary:
pip install mort
mort <file.py or module to execute>
When the exception occurs, the pdb repl should start in the given terminal
The simplest way is to wrap your entire code inside a try
block like this:
if __name__ == '__main__':
try:
raise Exception()
except:
import pdb
pdb.set_trace()
There is a more complicated solution which uses sys.excepthook
to override the handling of uncaught exceptions, as described in this recipe:
## {{{ http://code.activestate.com/recipes/65287/ (r5)
# code snippet, to be included in 'sitecustomize.py'
import sys
def info(type, value, tb):
if hasattr(sys, 'ps1') or not sys.stderr.isatty():
# we are in interactive mode or we don't have a tty-like
# device, so we call the default hook
sys.__excepthook__(type, value, tb)
else:
import traceback, pdb
# we are NOT in interactive mode, print the exception...
traceback.print_exception(type, value, tb)
print
# ...then start the debugger in post-mortem mode.
pdb.pm()
sys.excepthook = info
## end of http://code.activestate.com/recipes/65287/ }}}
The above code should be included in a file called sitecustomize.py inside site-packages
directory, which is automatically imported by python. The debugger is only started when python is run in non-interactive mode.