Как ускорить импорт модулей с переменными именами через importlib?

Я ломаю голову, чтобы придумать быстрый способ импорта моих пользовательских файлов Python, имена которых являются переменными и определяются вводом. Я пытаюсь сделать так, чтобы моя точка входа отправляла данные другим классам для обработки.

Структура папки:

root/
├─ dir1/
│  ├─ file1.py
├─ entrypoint.py
├─ dir2/
├─ dir3/

Все, что я пробовал, за исключением прямого выполнения from dir1 import file1, занимает 2-3 секунды, что слишком долго для моего использования и заставляет меня думать, что importlib сканирует все другие каталоги, прежде чем, наконец, найти правильный модуль.

Я пробовал это с importlib:

input_dir = "dir1"
input_file = "file1"

spec = importlib.util.spec_from_file_location(input_file,
            f'{os.path.dirname(os.path.abspath(__file__))}/{input_dir}/{input_file}.py')
class_ = importlib.util.module_from_spec(spec)
spec.loader.exec_module(class_)

person messysf    schedule 07.07.2021    source источник
comment
Размещенный вами код безоговорочно создаст новый объект модуля и запустит содержимое file1.py, даже если file1.py уже был загружен предыдущим выполнением того же кода. Это то, что вы хотите, чтобы произошло? (Обычный импорт этого не делает.)   -  person user2357112 supports Monica    schedule 07.07.2021
comment
И почему ты просто не делаешь module = importlib.import_module(whatever_fully_qualified_name)?   -  person user2357112 supports Monica    schedule 07.07.2021
comment
Отличный вопрос @user2357112supportsMonica и еще лучшее наблюдение. Я понятия не имел, что это будет иметь такой эффект, я, вероятно, должен потратить еще немного времени на документацию, чтобы это щелкнуло. Сначала я попробовал importlib.import_module, но после вызова getattr() для доступа к классу потребовалось 2-3 секунды. Я думаю, что только что нашел ответ на то, как избежать использования getattr() здесь: stackoverflow.com/questions/49434118/ - надо проверить это завтра   -  person messysf    schedule 08.07.2021