【问题标题】:How can I eliminate my custom __import__ hook from Python backtraces如何从 Python 回溯中消除我的自定义 __import__ 钩子
【发布时间】:2011-05-01 23:23:11
【问题描述】:

我是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 是否有办法在生成这些帧时从回溯中消除它们?

【问题讨论】:

    标签: python import built-in traceback


    【解决方案1】:

    可以,但您也不应该(即使是标准库的runpy 模块在通过@987654324 执行主模块时也会将自身留在堆栈跟踪中@ 转变)。当异常一直逃逸到程序的顶层时,很难提前确切知道哪些组件出了问题(并且正在进行重新加载的事实很可能很重要)。

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-04
        • 2020-08-15
        • 1970-01-01
        • 2020-03-08
        • 2014-04-15
        • 2020-09-08
        • 1970-01-01
        相关资源
        最近更新 更多