Как (и почему) pdb вносит изменения в механизм импорта? - PullRequest
0 голосов
/ 05 февраля 2020

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

...