1

Я хочу использовать 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() 

Есть ли способ не заботы о реальных именах модулей при ввозе?

+0

Не совсем уверен (никогда не делал этого), но я думаю, что это невозможно, если вы разрешаете загрузку из нескольких мест. У вас есть зависимости между модулями, т. Е. «/path/to/file.py» импортирует «/path/to/file2.py»? Заметьте, что я думаю, что этот случай невозможно получить :-) – mkiever

ответ

0

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

Смежные вопросы