Я хочу использовать 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()
Есть ли способ не заботиться о фактических именах модулей при импорте?