首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将sys.excepthook设置为在python中全局调用pdb?

问如何将sys.excepthook设置为在python中全局调用pdb?
EN

Stack Overflow用户
提问于 2009-08-06 07:15:46
回答 3查看 5.5K关注 0票数 7

来自Python文档:

sys.excepthook(type, value, traceback) 此函数输出sys.stderr的给定追溯和异常。 当异常被引发和隐藏时,解释器使用三个参数调用sys.excepthook,异常类、异常实例和跟踪对象。在交互式会话中,这种情况发生在控件返回提示符之前;在Python程序中,这发生在程序退出之前。可以通过向sys.excepthook分配另外三个参数函数来自定义此类顶级异常的处理。

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

如何对此进行全局修改,以使默认操作始终调用pdb?有我可以更改的配置文件吗?我不想包装我的代码来做这件事。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-08-06 07:27:07

这是你需要的

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

有三种方法,第一种方法很简单,但很粗糙(托马斯·海勒) --将以下内容添加到site-packages/sitecueuize.py中:

代码语言:javascript
复制
import pdb, sys, traceback
def info(type, value, tb):
    traceback.print_exception(type, value, tb)
    pdb.pm()
sys.excepthook = info

第二个更复杂,并从烹饪书中检查交互模式(奇怪地跳过交互模式中的调试)。

代码语言:javascript
复制
# 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被重定向)由因尼夫

代码语言:javascript
复制
# 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
票数 21
EN

Stack Overflow用户

发布于 2009-08-26 17:48:08

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

票数 1
EN

Stack Overflow用户

发布于 2009-08-06 07:31:43

尝试:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1237379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档