How do I set sys.excepthook to invoke pdb globally in python?

前端 未结 3 1859
你的背包
你的背包 2020-12-29 15:14

From Python docs:

sys.excepthook(type, value, traceback)

This function prints out a given traceback and exception to sy

相关标签:
3条回答
  • 2020-12-29 15:29

    Try:

    import pdb
    import sys
    
    def excepthook(type, value, traceback):
        pdb.post_mortem(traceback)
    
    excepthook.old = sys.excepthook
    sys.excepthook = excepthook
    
    def raise_exception():
        raise_exception()
    
    raise_exception()
    
    0 讨论(0)
  • 2020-12-29 15:31

    Another option is to use ipython, which I consider a must-have tool for any python developer anyway. Instead of running your script from the shell, run it from ipython with %run. When an exception occurs, you can type %debug to debug it. (There's also an option to automatically debug any exception that occurs, but I forget what it is.)

    0 讨论(0)
  • 2020-12-29 15:34

    Here's what you need

    http://ynniv.com/blog/2007/11/debugging-python.html

    Three ways, the first is simple but crude (Thomas Heller) - add the following to site-packages/sitecustomize.py:

    import pdb, sys, traceback
    def info(type, value, tb):
        traceback.print_exception(type, value, tb)
        pdb.pm()
    sys.excepthook = info
    

    The second is more sophisticated, and checks for interactive mode (weirdly skipping the debugging in interactive mode), from the cookbook:

    # 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
    

    And the third (which always start the debugger unless stdin or stderr are redirected) by ynniv

    # code snippet, to be included in 'sitecustomize.py'
    import sys
    
    def info(type, value, tb):
       if (#hasattr(sys, "ps1") or
           not sys.stderr.isatty() or 
           not sys.stdin.isatty()):
           # stdin or stderr is redirected, just do the normal thing
           original_hook(type, value, tb)
       else:
           # a terminal is attached and stderr is not redirected, debug 
           import traceback, pdb
           traceback.print_exception(type, value, tb)
           print
           pdb.pm()
           #traceback.print_stack()
    
    original_hook = sys.excepthook
    if sys.excepthook == sys.__excepthook__:
        # if someone already patched excepthook, let them win
        sys.excepthook = info
    
    0 讨论(0)
提交回复
热议问题