Я хочу использовать API CPython C для загрузки файлов Python в виде плагинов из приложения C. Эти файлы Python содержат классы и другие материалы, и я знаю, как их получить, когда у меня есть объект модуля.importlib: Как импортировать несколько файлов 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()
Есть ли способ не заботы о реальных именах модулей при ввозе?
Не совсем уверен (никогда не делал этого), но я думаю, что это невозможно, если вы разрешаете загрузку из нескольких мест. У вас есть зависимости между модулями, т. Е. «/path/to/file.py» импортирует «/path/to/file2.py»? Заметьте, что я думаю, что этот случай невозможно получить :-) – mkiever