В настоящее время я добавляю возможность пользователям расширять функциональность моего настольного приложения (С++) с помощью плагинов, написанных на питоне.
Наивный метод достаточно прост. Вставьте статическую библиотеку python и выполните любое количество десятков обучающих программ, разбросанных по сети, в которых описано, как инициализировать и вызывать файлы python, и вы в значительной степени выполняете.
Однако...
То, что я ищу, больше похоже на то, что делает Blender. Blender полностью настраивается с помощью скриптов python, и для этого требуется внешний исполняемый файл python. (Например, python фактически не является встроенным в исполняемом модуле blender). Таким образом, естественно, вы можете включать в себя все модули, которые у вас уже есть в каталоге сайтов, когда вы пишете сценарии блендера. Не то, что рекомендуется, поскольку это ограничивает переносимость вашего script.
Итак, я хочу знать, есть ли способ получить ваш торт и съесть его тоже. Я хочу систему плагинов, которая использует:
-
Встроенный интерпретатор python.
Недостатком подхода Blender является то, что он заставляет вас иметь определенную, возможно устаревшую версию python, установленную глобально в вашей системе. Наличие встроенного интерпретатора позволяет мне контролировать, какая версия python используется.
-
Плагины межсетевого экрана.
Некоторый эквивалент a
virtualenv
для каждого плагина; позволяя им устанавливать все модули, в которых они нуждаются или хотят, но сохраняя их от возможных конфликтов в других плагинах. Может быть,zc.buildout
является лучшим кандидатом здесь, но, опять же, я очень открыт для предложения. Я немного не понимаю, как это сделать. -
Как можно безболезненно...
Для пользователя. Я желаю пройти лишнюю милю, только если большая часть вышеперечисленного настолько прозрачна для плагина, насколько это возможно.
Если кто-то из вас, у кого-нибудь есть какой-либо опыт такого рода вещей, ваша помощь будет высоко оценена.:)
Edit:
В основном, короткая версия того, что я хочу, это простота virtualenv
, но без связанного интерпретатора python и способ программной активации конкретной "виртуальной среды", например, zc.buildout
с помощью sys.path(sys.path[0:0] = [...]
трюк).
Оба virtualenv
и zc.buildout
содержат части того, что я хочу, но не производят перемещаемые сборки, которые я, или разработчик плагина, могут просто зашифровать и отправить на другой компьютер.
Простое манипулирование файлами .pth или манипулирование sys.path
непосредственно в script, выполненном из моего приложения, получает меня на полпути. Но этого недостаточно, когда требуются компилированные модули, такие как PIL.