Динамическая загрузка не скомпилированных плагинов Python в код компиляции py2exe - PullRequest
6 голосов
/ 15 июля 2010

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

plugin_name = blablabla
try:
    module = __import__(plugin_name, fromlist='do_something')
except ImportError:
   #some error handling ...

и затем выполняю:

try:
    loans = module.do_something(id_t, pin_t)
except xxx:
    # error handling

Я компилирую приложение в двоичный файл Windows, используя py2exe. Это прекрасно работает, за исключением того факта, что все плагины (и должны быть) включены в двоичный файл. Это не очень практично, поскольку для каждого нового плагина я должен перекомпилировать и выпустить новыйверсия моего приложения.Было бы лучше, если бы новый плагин (то есть файл python) мог быть скопирован в какую-либо папку плагинов приложения, и чтобы код Python в коде файла интерпретировался моим приложением на лету.

Каков наилучший подход для этого?

(хотя я прочитал каждую строку выбранного файла плагина и применил оператор exec кэто. Но могут быть и лучшие способы ...)

Ответы [ 5 ]

3 голосов
/ 01 августа 2010

Если вы не возражаете, что плагины будут выпущены в виде файлов .py, вы можете сделать что-то вроде следующего.Поместите все ваши плагины в подкаталог «plugin» и создайте пустой «__init__.py».Во время выполнения он импортирует пакет вместе со всеми модулями в этом каталоге.Проверьте Dive In Python для объяснения ... но вот что я, в конце концов, в итоге использую.

1 голос
/ 20 июля 2010

PyInstaller позволяет также импортировать внешние файлы. Если вы запустите его поверх своего приложения, оно не будет упаковывать эти файлы в исполняемый файл. Затем вам нужно убедиться, что пути правильные (то есть ваше приложение может найти модули на диске в правильном каталоге), и все должно работать.

0 голосов
/ 03 ноября 2016

Я нашел, как сделать импорт внешних модулей (поверх скомпилированного исполняемого файла во время выполнения) с помощью pyinstaller.он показывает, что изначально путь к исполняемому файлу был автоматически добавлен в sys.path, но по соображениям безопасности они в какой-то момент удалили его.чтобы снова включить это, используйте:

sys.path.append(os.path.dirname(sys.executable))

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

0 голосов
/ 20 июля 2010

Я не уверен, что вы должны поместить файлы плагинов в библиотеку zip.Это может быть связано с тем, что вы используете по умолчанию для py2exe, упаковывающего ваш скрипт.

Вы можете попробовать использовать сжатый = False (как описано в py2exe ListOfOptions ), что устранит сгенерированный файл library.zip.py2exe, и, возможно, позволит вам иметь доступ к модулям Python (ваши плагины являются модулями Python, я полагаю, из import ) «обычным» способом, вместо того, чтобы заставлять их упаковывать в zipили двоичный файл.

0 голосов
/ 16 июля 2010

Я предлагаю вам использовать функции pkg_resources entry_points (из setuptools / distribution) для реализации обнаружения и создания плагинов: во-первых, это стандартный способ сделать это; во-вторых, не страдает проблема, которую вы упоминаете AFAIK. Все, что вам нужно сделать, чтобы расширить приложение, это упаковать несколько плагинов в яйцо, которое объявляет некоторые точки входа (яйцо может объявить много плагинов), и когда вы устанавливаете это яйцо в ваш дистрибутив python, все плагины, которые он объявляет, могут автоматически обнаружен вашим приложением. Вы также можете упаковать ваше приложение и «фабричные» плагины в одно яйцо, это очень удобно.

...