importlib: как импортировать несколько файлов Python, не заботясь об именах модулей

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

Текущее решение, которое мне нужно для импорта файла Python и получения объекта модуля, таково (Python 3):

import importlib

module = importlib.machinery.SourceFileLoader('some_module', '/path/to/file.py').load_module()

Я могу сделать то же самое с C API.

Насколько я понимаю, объект модуля также добавляется в словарь sys.modules с ключом some_module.

Моя проблема в том, что если я загружаю второй модуль, также указав some_module в качестве имени модуля, имена, найденные во втором модуле, добавляются к тому же загруженному модулю, что и первый, а существующие имена перезаписываются! То есть в этом случае:

import importlib

module = importlib.machinery.SourceFileLoader('some_module', '/path/to/file.py').load_module()
module2 = importlib.machinery.SourceFileLoader('some_module', '/path/to/file2.py').load_module()

module и module2 на самом деле один и тот же объект. В моем случае это плохо, потому что оба плагина могут (и будут) иметь одинаковые глобальные имена.

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

Зная это, могу ли я создать уникальное имя модуля из пути? Тогда последний пример становится:

import importlib

module = importlib.machinery.SourceFileLoader('path_to_file', '/path/to/file.py').load_module()
module2 = importlib.machinery.SourceFileLoader('path_to_file2', '/path/to/file2.py').load_module()

Есть ли способ не заботиться о фактических именах модулей при импорте?


person eepp    schedule 20.01.2017    source источник
comment
Не совсем уверен (никогда этого не делал), но я думаю, что это невозможно, если разрешить загрузку из нескольких мест. Есть ли у вас зависимости между модулями, например, /path/to/file.py импортирует /path/to/file2.py? Обратите внимание, что я думаю, что этот случай невозможно заставить работать :-)   -  person mkiever    schedule 20.01.2017


Ответы (1)


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

person Sasha Kacanski    schedule 02.11.2017