2016-12-06 2 views
0

У меня есть графический интерфейс Python, который может загружать и запускать пакеты плагинов во время выполнения. Плагин-пакет - это просто пакет Python, который включает в себя все дополнительные библиотеки, необходимые для кода плагина. Эти дополнительные библиотеки хранятся в подпапке сайта-пакетов плагина. Файловая структура типичного плагина будет выглядеть так:Используйте разные версии пакетов Python в зависимости от используемого плагина

myplugin/__init__.py 
myplugin/plugin_main.py 
myplugin/site-packages/foolib/__init__.py 
myplugin/site-packages/foolib/foo_main.py 

Для того, чтобы сделать plugin_main.py возможность импортировать библиотеки как foolib я добавил сайт-пакеты подкаталог PYTHONPATH путем добавления этого кода в plugin_main. py:

import sys 
packages_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "site-packages") 
sys.path.insert(1, packages_path) 
import foolib 

Пока что так хорошо. Это работает в основном. Проблема в том, что если GUI загружает второй плагин, который должен импортировать собственную версию foolib, на самом деле вместо этого используется версия foolib из первого плагина. Другими словами: даже если разные плагины поставляются с различными версиями foolib в своей подпапке сайтов-пакетов, это всегда та же самая версия, которая используется в графическом интерфейсе.

Что мне нужно, так это когда GUI загружает myplugin, тогда следует использовать foolib из myplugin/site-packages. Если я потом загружу myotherplugin, тогда он должен использовать foolib из myotherplugin/site-пакетов, а не из myplugin/site-packages. Надеюсь, я поставил проблему в ясность.

Помогла ли вам помощь imp?

ответ

0

Я должен был понять, что нет надежного способа добиться того, что я пытался сделать. Вместо этого я решил переместить каждый плагин в отдельный процесс с использованием многопроцессорности Python. Это было действительно очень легко сделать и, вероятно, это самое чистое решение.

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