如何从Python回溯中消除我的自定义__import__钩子

时间:2011-05-01 23:23:12

标签: python import built-in traceback

我是the Lazy Python Reloader的实现者,并且一切都运行得非常好,除了一旦我覆盖内置__import__函数,我开始在模块中出现错误时看到我在追溯中的替换被装载。例如,下面有两个_real_import实例,这只是一个分心 - 他们只是调用内置导入函数:

 File "/Library/Python/2.6/site-packages/buildbot-0.8.4_pre_521_gea039fa-py2.6.egg/buildbot/master.py", line 207, in do_load
    exec f in localDict
  File "/Users/dave/src/fossbot-top/master.cfg", line 13, in <module>
    from fossbot import *
  File "/Library/Python/2.6/site-packages/lazy_reload.py", line 83, in _lazy_reload_import
    m = _real_import(name, globals, locals, fromlist, level)
  File "/Users/dave/src/fossbot-top/fossbot/__init__.py", line 22, in <module>
    projects = 'fossbot.projects'
  File "/Users/dave/src/fossbot-top/fossbot/bbot/__init__.py", line 24, in master
    for m in load_submodules(projects):
  File "/Users/dave/src/fossbot-top/fossbot/bbot/util.py", line 30, in load_submodules
    ret.append(_import(parent_module_name+'.'+submodule_name))
  File "/Users/dave/src/fossbot-top/fossbot/bbot/util.py", line 4, in _import
    __import__(module_name)
  File "/Library/Python/2.6/site-packages/lazy_reload.py", line 83, in _lazy_reload_import
    m = _real_import(name, globals, locals, fromlist, level)
  File "/Users/dave/src/fossbot-top/fossbot/projects/el_get.py", line 13, in <module>
    build_procedures=[GitHubElisp('dimitri/el-get')] + 1

是否有人知道lazy_reload是否有办法在生成这些帧时从回溯中消除这些帧?

2 个答案:

答案 0 :(得分:2)

可以但你也不应该(当主模块通过执行时,甚至标准库的runpy模块也会自己留在堆栈跟踪中-m切换)。当异常一直逃到程序的顶层时,很难准确地知道哪些组件出错(并且重新加载的事实很有可能是重要的)。

如果您仍想继续沿着这条路走下去,我建议先来看看: How can I modify a Python traceback object when raising an exception?

然后在Jinja2代码中试图使模板代码产生准确的回溯(上述问题的答案中的链接已过时): https://github.com/mitsuhiko/jinja2/blob/master/jinja2/debug.py

答案 1 :(得分:1)

不是没有严厉地破解语言。我不建议这样做,因为隐藏堆栈跟踪的一部分通常是个坏主意。特别是如果模块的一部分引入了意外错误。