如何从Python回溯中消除自定义的导入钩子

如何从Python回溯中消除自定义的导入钩子,python,import,built-in,traceback,Python,Import,Built In,Traceback,我是的实现者,它工作得很好,除了我重写了内置的\uuuu import\uuu函数之后,每当加载的模块出现错误时,我就开始在回溯中看到我的替换。例如,下面有两个\u real\u 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

我是的实现者,它工作得很好,除了我重写了内置的
\uuuu import\uuu
函数之后,每当加载的模块出现错误时,我就开始在回溯中看到我的替换。例如,下面有两个
\u real\u 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
文件“/Library/Python/2.6/site packages/buildbot-0.8.4_pre_521_gea039fa-py2.6.egg/buildbot/master.py”,第207行,在do_load中
localDict中的execf
文件“/Users/dave/src/fossbot-top/master.cfg”,第13行,在
从fossbot导入*
文件“/Library/Python/2.6/site packages/lazy\u reload.py”,第83行,在“lazy\u reload\u导入”中
m=_real_import(名称、全局、局部、fromlist、级别)
文件“/Users/dave/src/fossbot-top/fossbot/_-init__uuu.py”,第22行,在
projects='fossbot.projects'
文件“/Users/dave/src/fossbot-top/fossbot/bbot/_-init__uuu.py”,主文件第24行
对于m in load_子模块(项目):
文件“/Users/dave/src/fossbot-top/fossbot/bbot/util.py”,第30行,在load_子模块中
ret.append(_导入(父模块名称+'.+子模块名称))
文件“/Users/dave/src/fossbot-top/fossbot/bbot/util.py”,第4行,在导入中
__导入(模块名称)
文件“/Library/Python/2.6/site packages/lazy\u reload.py”,第83行,在“lazy\u reload\u导入”中
m=_real_import(名称、全局、局部、fromlist、级别)
文件“/Users/dave/src/fossbot-top/fossbot/projects/el_-get.py”,第13行,在
构建过程=[GitHubElisp('dimitri/el get')]+1

有人知道有没有一种方法可以让“懒散”重新加载在生成帧时从回溯中消除这些帧吗?

如果没有对该语言进行严格的黑客攻击,这是不可能的。我不建议这样做,因为隐藏堆栈跟踪的一部分通常是个坏主意。尤其是当模块的某个部分出现意外错误时。

您可以,但也不应该(当通过
-m
开关执行主模块时,即使是标准库的
runpy
模块也会在堆栈跟踪中留下自己)。当异常一路逃逸到程序的顶层时,很难事先准确知道哪些组件出了故障(而且正在进行的重新加载很有可能是重要的)

如果你还想继续沿着这条路走下去,我建议你首先看看:

然后是Jinja2代码,它试图使模板代码产生准确的回溯(上述问题答案中的链接已过时):