Я являюсь разработчиком 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
удалить эти кадры из обратных трасс при их создании?
Вы можете, но не должны (даже стандартный модуль runpy
оставляет себя в трассировке стека, когда главный модуль выполняется с помощью переключателя -m
). Когда исключение полностью выходит на верхний уровень программы, трудно заранее знать, какие компоненты были виноваты (и тот факт, что перегрузка продолжается, имеет большой шанс быть значительным).
Если вы все еще хотите продолжить этот путь, я предлагаю сначала взглянуть на: Как изменить объект трассировки Python при создании исключения?
И затем в коде Jinja2, который пытается сделать код шаблона, создает точную трассировку (ссылка в ответах на вышеупомянутый вопрос устарела): https://github.com/mitsuhiko/jinja2/blob/master/jinja2/debug.py
Не без жестокого взлома языка. Я бы не рекомендовал этого, также потому, что обычно сложно скрыть часть трассировки стека. Особенно, если часть вашего модуля представляет непредвиденную ошибку.