Система плагинов Python3 - PullRequest
       45

Система плагинов Python3

2 голосов
/ 20 декабря 2011

Я пытаюсь создать плагин-фреймворк, похожий на yapsy (к сожалению, yapsy не совместим с python3).

Мой код выглядит так:

root
   main.py
   plugins/
       __init__.py
       PluginManager.py
       UI/
           __init__.py
           textui.py

В PluginManager.py я определил следующий класс:

class PluginMetaclass(type):
    def __init__(cls, name, base, attrs):
        if not hasattr(cls, 'registered'):
            cls.registered = []
        else:
            cls.registered.append((name,cls))

class UI_Plugins(object):
    __metaclass__ = PluginMetaclass

    #...some code here....

    def load():
         #...some code here too...

        if "__init__" in  os.path.basename(candidate_filepath):
            sys.path.append(plugin_info['path'])
        try:
            candidateMainFile = open(candidate_filepath+".py","r")  
            exec(candidateMainFile,candidate_globals)
        except Exception as e:
            logging.error("Unable to execute the code in plugin: %s" % candidate_filepath)
            logging.error("\t The following problem occured: %s %s " % (os.linesep, e))
            if "__init__" in  os.path.basename(candidate_filepath):
                sys.path.remove(plugin_info['path'])
            continue

где кандидат_файл содержит путь к плагину.

textui.py содержит следующее:

from root.plugins.PluginManager import UI_Plugins

class TextBackend(UI_Plugins):
    def run(self):
        print("c")

Когда я пытаюсь загрузить плагин, я получаю эту ошибку:

No module named plugins.PluginManager 

Как я могу решить эту проблему?

Ответы [ 3 ]

5 голосов
/ 23 декабря 2011

Извините, это, конечно, не прямой ответ на ваш вопрос, но если вы пытаетесь разработать что-то очень похожее на yapsy для python3, то вас может заинтересовать новая версия yapsy, в которой я выпустил парусовместимых с python3 пакетов:

https://sourceforge.net/projects/yapsy/files/Yapsy-1.9/

(см. Yapsy-1.9_python3-py3.2.egg или Yapsy-1.9-python3.tar.gz)

Исходный код находится в определенной ветке:

http://yapsy.hg.sourceforge.net/hgweb/yapsy/yapsy/file/91ea058181ee

2 голосов
/ 20 декабря 2011

Оператор импорта

from root.plugins.PluginManager import UI_Plugins

не работает, поскольку root не является пакетом.

Однако, если приложение запускается с

python3 root/main.py

тогда root на самом деле не нужно , чтобы быть пакетом.

Все, что вам нужно сделать, это изменить оператор импорта в textui.py на

from plugins.PluginManager import UI_Plugins

и все должно работать правильно.

Причина, по которой это работает, заключается в том, что каталог запущенного в данный момент сценария всегда автоматически добавляется в начало sys.path.В вашем случае это будет root, и поскольку plugins - это пакет в этом каталоге, его можно напрямую импортировать из любого места в вашем приложении.Таким образом, пока ваш main скрипт остается там, где он есть, никаких других манипуляций с путями не должно быть.

1 голос
/ 20 декабря 2011
  1. Чтобы иметь пакет, вам нужно иметь файл __init__.py в каталоге.Он может быть пустым, но он должен быть там, в каталогах «root» и «plugin».
  2. Имя каталога - это имя пространства имен, и поэтому они должны тщательно совпадать.В вашем случае вам нужно использовать from root.plugin.PluginManager import UI_Plugins
  3. Наконец, чтобы импорт работал, пакет должен быть в вашей PYTHONPATH (см. Путь поиска модуля на языкедокументация).Это можно сделать, либо добавив каталог в переменную окружения PYTHONPATH, либо в коде, добавив его в список sys.path.
...