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

2024-10-02 10:21:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: nameinpyimportsrctoplineusers
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

如果没有严重的语言黑客攻击。我不建议这样做,也因为隐藏堆栈跟踪的一部分通常不是一个好主意。尤其是如果模块的某个部分引入了意外错误。在

相关问题 更多 >

    热门问题