Как я могу удалить свой собственный хук __import__ из следов Python

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 удалить эти кадры из обратных трасс при их создании?

Теги:
import
traceback
built-in

2 ответа

2

Вы можете, но не должны (даже стандартный модуль runpy оставляет себя в трассировке стека, когда главный модуль выполняется с помощью переключателя -m). Когда исключение полностью выходит на верхний уровень программы, трудно заранее знать, какие компоненты были виноваты (и тот факт, что перегрузка продолжается, имеет большой шанс быть значительным).

Если вы все еще хотите продолжить этот путь, я предлагаю сначала взглянуть на: Как изменить объект трассировки Python при создании исключения?

И затем в коде Jinja2, который пытается сделать код шаблона, создает точную трассировку (ссылка в ответах на вышеупомянутый вопрос устарела): https://github.com/mitsuhiko/jinja2/blob/master/jinja2/debug.py

1

Не без жестокого взлома языка. Я бы не рекомендовал этого, также потому, что обычно сложно скрыть часть трассировки стека. Особенно, если часть вашего модуля представляет непредвиденную ошибку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню