Форум сайта python.su
Кто-нибудь сталкивался с необходимостью подгружать плагины?
Например у нас в каталоге с программой есть папочка plugins и все *.py файлы нам нужно импортировать и использовать (грязно). Какие есть способы кроме добавления plugins в PATH? Да и вообще как это делается? :) Желательно примеры кода или сцылки…
Так же очень волнует вопрос будет ли такая возможность после упаковки все py2exe
Офлайн
http://python.su/blog/public/2008/09/17/podderzhka-plaginov-v-programmah-na-python/
http://jenyay.net/Programming/PyPlugins
После упаковки в py2exe все работает нормально, проверено лично.
Офлайн
Может import?
Офлайн
Скорее __import__. Я как-то делал подобное и статьи, показаммые Игорем, мне очень даже пригодились.
Ещё на pypi было что-то готовое для этих целей…
Офлайн
о, здорово, как то я их проглядел :)
Благодарю.
Офлайн
Поднимаю вопрос с новой силой :)
По статье выше мы успешно импортируем все плагины, создаем экземпляры классов и выполняем како-нибудь метод. Теперь же мне нужно импортировать сам класс, чтобы потом клепать его экземпляры.
Примерно то что нужно сделать: импортировать все файлы-плагины, на каждый класс создать кнопочку в окошке и чтобы при нажатии на эту кнопочку создавался новый экземпляр этого касса +)
Ума не приложу как так сделать…
Офлайн
Сам спросил, сам ответил :)
А что если один из вызываемых методов будет возвращать сам класс? cls или селф там… Прокатит?
Офлайн
Вот кусочек кода из моего текущего проекта, где как раз делаю тоже самое.
s=os.listdir('app/plugins/frames')
for x in s:
if x.endswith('.py'):
obj=__import__(x[:-3])
# у плагина должна быть константа name, которая будет выводится как текст кнопки
name=getattr(obj,'name')
# пропускаем не интересный в данный момент код
# на каждую кнопочку вешаем команду, которая будет вызываться при нажатии
self.pl_buttons[(row[fr],column[fr])]['command']=lambda pl=obj:self.show_plugin(pl)
def show_plugin(self,obj):
# у каждого плагина должен быть класс Plugin, получаем экземпляр этого класса
cl=getattr (obj, 'Plugin')(self)
# и вызываем метод run
cl.run()
Офлайн
cl=getattr (obj, ‘Plugin’)(self)
что делает эта строчка? Можно поконкретнее :)
Получаем класс Plugin из obj, а что такое (self) еще?
Офлайн
obj это объект “модуль”, соответственно cl=getattr (obj, ‘Plugin’)(self) получаем экземпляр класса Plugin из этого модуля.
self я передаю в конструктор класса, чтоб в импортируемом плагине можно было использовать методы класса из которого мы импортировали плагин. Вот такое вот ненормальное наследование получилось, но мне так удобнее для этого проекта получилось. Тоже самое что
class Plugin:
def __init__(self,app):
self.app=app
def run(self):
self.app.execute('...')
class Main:
def __init__(self):
self.db=sqlite3.connect('...')
cl=Plugin(self)
cl.run()
Отредактировано (Апрель 19, 2010 11:17:25)
Офлайн