Starting python debugger automatically on error Starting python debugger automatically on error python python

Starting python debugger automatically on error


python -m pdb -c continue myscript.py

If you don't provide the -c continue flag then you'll need to enter 'c' (for Continue) when execution begins. Then it will run to the error point and give you control there. As mentioned by eqzx, this flag is a new addition in python 3.2 so entering 'c' is required for earlier Python versions (see https://docs.python.org/3/library/pdb.html).


You can use traceback.print_exc to print the exceptions traceback. Then use sys.exc_info to extract the traceback and finally call pdb.post_mortem with that traceback

import pdb, traceback, sysdef bombs():    a = []    print a[0]if __name__ == '__main__':    try:        bombs()    except:        extype, value, tb = sys.exc_info()        traceback.print_exc()        pdb.post_mortem(tb)

If you want to start an interactive command line with code.interact using the locals of the frame where the exception originated you can do

import traceback, sys, codedef bombs():    a = []    print a[0]if __name__ == '__main__':    try:        bombs()    except:        type, value, tb = sys.exc_info()        traceback.print_exc()        last_frame = lambda tb=tb: last_frame(tb.tb_next) if tb.tb_next else tb        frame = last_frame().tb_frame        ns = dict(frame.f_globals)        ns.update(frame.f_locals)        code.interact(local=ns)


Use the following module:

import sysdef 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() # deprecated        pdb.post_mortem(tb) # more "modern"sys.excepthook = info

Name it debug (or whatever you like) and put it somewhere in your python path.

Now, at the start of your script, just add an import debug.