Модификация / отладка замороженных встроенных функций, таких как importlib / _boostrap_external.py - PullRequest
1 голос
/ 28 октября 2019

Короткая версия : Как отлаживать замороженные библиотеки? Могу ли я сказать Python не использовать их (и не использовать исходные файлы) или как-нибудь их снова заморозить?


Я пытаюсь узнать больше о внутренней функциональности механизмов импорта питонов. И, спускаясь по этой кроличьей норе, я хочу отладить /usr/lib/python37/importlib/_bootstrap_external.py.

. Использование python -m trace --trace myscript.py дало мне указание, где в _bootstrap_external.py я приземляюсь, но не значения. Поэтому я обратился к pdb, и он дал мне немного информации, но, похоже, пропускает _frozen объекты. (?).

Итак, я добавил несколько print('moo'), где я увидел, что мой сценарий заканчивался на _boostrap_external.py, но отпечатки не делались, потому что Python внутренне использует <class '_frozen_importlib_external.PathFinder'>

. приведите меня в отчаянную попытку попробовать переименовать / удалить /usr/lib/python37/importlib/__pycache__ в надежде, что Python перекомпилирует мои изменения. Но не повезло, Python по-прежнему использует замороженную версию.

Поэтому я изменил /usr/lib/python37/__init__.py, где он импортирует модуль _bootstrap, поэтому я изменил это:

try:
    import _frozen_importlib_external as _bootstrap_external
except ImportError:
    from . import _bootstrap_external
    _bootstrap_external._setup(_bootstrap)
    _bootstrap._bootstrap_external = _bootstrap_external
else:
    _bootstrap_external.__name__ = 'importlib._bootstrap_external'
    _bootstrap_external.__package__ = 'importlib'
    try:
        _bootstrap_external.__file__ = __file__.replace('__init__.py', '_bootstrap_external.py')
    except NameError:
        # __file__ is not guaranteed to be defined, e.g. if this code gets
        # frozen by a tool like cx_Freeze.
        pass
    sys.modules['importlib._bootstrap_external'] = _bootstrap_external

на следующее:

from . import _bootstrap_external
_bootstrap_external._setup(_bootstrap)
_bootstrap._bootstrap_external = _bootstrap_external
_bootstrap_external.__name__ = 'importlib._bootstrap_external'
_bootstrap_external.__package__ = 'importlib'
try:
    _bootstrap_external.__file__ = __file__.replace('__init__.py', '_bootstrap_external.py')
except NameError:
    # __file__ is not guaranteed to be defined, e.g. if this code gets
    # frozen by a tool like cx_Freeze.
    pass
sys.modules['importlib._bootstrap_external'] = _bootstrap_external

И это сработало, иш. Очевидно, что проблема будет становиться все более и более сложной, и должно быть более общее решение. Но я продолжил свое путешествие и обнаружил, что _bootstrap.py действительно загружен моими print('moo') изменениями. Но когда /usr/lib/python37/importlib/_bootstrap.py позже вызывает функцию _find_spec, и она делает:

    for finder in meta_path:
        with _ImportLockContext():
            find_spec = finder.find_spec
            spec = find_spec(name, path, target)

find_spec снова ссылается на замороженную версию. (фрагмент кода сокращен до соответствующего кода в _bootstrap.py)

Итак, мой вопрос, наконец, заканчивается, как мне отладить эти замороженные файлы? или как мне сделать так, чтобы Python игнорировал замороженные библиотеки (я могу повлиять на производительность при отладке). Каждая попытка найти информацию об этом (поиск, документы, irc и т. Д.) Заканчивается «почему?»или "не делай этого", или это указывает мне на py2exe и как заморозить мои библиотеки. Я просто хочу уметь отлаживать и понимать, как работает внутренняя механика, пытаясь что-то сделать и посмотрев на переменные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...