【问题标题】:How do I set sys.excepthook to invoke pdb globally in python?如何设置 sys.excepthook 在 python 中全局调用 pdb?
【发布时间】:2010-11-17 06:24:01
【问题描述】:

来自 Python 文档:

sys.excepthook(type, value, traceback)

此函数将给定的回溯和异常打印到sys.stderr

当异常被引发但未被捕获时,解释器使用三个参数调用sys.excepthook,异常类、异常实例和回溯对象。在交互式会话中,这发生在控制返回到提示之前;在 Python 程序中,这发生在程序退出之前。可以通过将另一个三参数函数分配给sys.excepthook 来自定义对此类顶级异常的处理。

http://docs.python.org/library/sys.html

如何在全局范围内修改它以使默认操作始终调用pdb?有我可以更改的配置文件吗?我不想包装我的代码来执行此操作。

【问题讨论】:

    标签: python debugging configuration pdb


    【解决方案1】:

    这就是你需要的

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

    三种方法,第一种简单但粗略(Thomas Heller) - 将以下内容添加到 site-packages/sitecustomize.py:

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

    第二个更复杂,并检查交互模式(奇怪地跳过交互模式下的调试),来自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
    

    第三个(总是启动调试器,除非 stdin 或 stderr 被重定向)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
    

    【讨论】:

      【解决方案2】:

      另一个选择是使用 ipython,无论如何我认为它是任何 python 开发人员必备的工具。不要从 shell 运行脚本,而是使用 %run 从 ipython 运行它。发生异常时,可以键入 %debug 进行调试。 (还有一个选项可以自动调试发生的任何异常,但我忘记了它是什么。)

      【讨论】:

        【解决方案3】:

        试试:

        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()
        

        【讨论】:

        • 我认为将 pdb 调用者命名为“excepthook”并不明智。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多