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

Я являюсь разработчиком 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 исключить эти кадры из следов при их создании?

Ответы [ 2 ]

2 голосов
/ 02 мая 2011

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

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

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

1 голос
/ 02 мая 2011

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

...