1

我是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生成这些帧时从回溯中消除这些帧?

4

2 回答 2

2

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

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

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

于 2011-05-02T13:10:59.190 回答
1

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

于 2011-05-01T23:31:41.960 回答