Я пытаюсь понять / исследовать, как sys.path_hooks
работает / используется. Однако, поскольку importlib/_bootstrap_external.py
является замороженным модулем, его нелегко отладить с помощью pdb
. Поэтому я добавил несколько моих хуков к sys.path_hook
, чтобы увидеть, что происходит, например:
import sys
def logging_hook(path):
print("searching path:", path)
raise ImportError
sys.path_hooks.insert(0, logging_hook)
import doesntexist # doesn't exist and should fail
Так что мой хук, добавленный при первой возможности, записывает путь для которые sys.path_hooks
используются, и вызывает ImportError
, поэтому поиск переходит к следующему хуку.
Результат, как и ожидалось, - path
регистрируется, а затем происходит сбой импорта:
searching path: <my path> #HERE PATH IS LOGGED!
Traceback (most recent call last):
...
ModuleNotFoundError: No module named 'doesntexist'
Однако, я добавляю import pdb
в микс, мой хук больше не называется:
import pdb
import sys
.... # the above code
приводит к:
# NO PATH LOGGED!
Traceback (most recent call last):
...
ModuleNotFoundError: No module named 'doesntexist'
Кажется, работает, если pdb
импортируется после вставки хука, то есть:
... # the above code
sys.path_hooks.insert(0, logging_hook)
import pdb # now hook is taken into account!
import doesntexist # doesn't exist and should fail
pdb
, кажется, не работает с механизмом импорта, но как и почему?