试图实现import->调试模式模块

时间:2011-04-01 16:05:19

标签: python debugging

所以我试图创建一个模块,导入时会导致任何异常掉入pdb。我认为它看起来像这样:

#file A.py
import pdbOnException

a = 1/0
print a

#file pdbOnException
import sys, pdb

magic_object = # do magic stuff to get an object that, when called, does what I want :D

try:
   magic_object()
except:
   tb = sys.exc_info()[2]
   pdb.post_mortem(tb)

希望我正在尝试做的事情相当明显。我试图这样做,以便任何导入它的模块将有未处理的异常转到pdb。

编辑:我想我应该添加我想要使用的内容,看看你是否对此有所了解。我打算将模块添加到eclipse的“Forced Builtins”中,以便eclipse具有此功能(它是SORELY需要的) 任何人都可以帮助我吗?

Edit2:在玩了一堆eclipse之后,看起来没有办法在运行任何代码之前强制eclipse运行一组代码(例如像PYTHONSTARTUP)。哪个很烂。所以我想我会选择装饰师。

如果您仍然知道如何通过导入模块来实现这一目标,我很满意。它可以添加到IDLE启动脚本中。

更新: 我只是使用装饰器工作,但用户必须调用它的主要功能(这不是世界末日...但我希望更多的功能)。这是:

def pdb_on_exception(function):
   def returnfunction(*args, **kwargs):
         try:
            return function(*args, **kwargs)
         except Exception as E:
            traceback.print_tb(sys.exc_info()[2])
            print E
            tb = sys.exc_info()[2]
            pdb.post_mortem(tb)
   return returnfunction

如果正在修饰的函数存在未处理的异常,这将使您进入pdb。这很酷但仍然不是我想要的:D

1 个答案:

答案 0 :(得分:3)

这非常简单,你只需要挂钩到sys.excepthook:

fullofeels.py:

import sys, pdb

def except_hook(exctype, value, traceback):
    if previous_except_hook:
        previous_except_hook(exctype, value, traceback)

    pdb.post_mortem(traceback)

previous_except_hook = sys.excepthook
sys.excepthook = except_hook

用法:

通常情况下,我们只会得到追溯:

>>> 1/0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero

但是导入fullofeels,我们属于pdb:

>>> import fullofeels
>>> 1/0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
> <stdin>(1)<module>()
(Pdb)

多田!

我不知道那个气垫船中有多少鳗鱼,但是对于简单的情况它是有效的。