Найти - Пользователи
Полная версия: Подключение папки с плагинами
Начало » Python для новичков » Подключение папки с плагинами
1
Zubchick
Кто-нибудь сталкивался с необходимостью подгружать плагины?
Например у нас в каталоге с программой есть папочка plugins и все *.py файлы нам нужно импортировать и использовать (грязно). Какие есть способы кроме добавления plugins в PATH? Да и вообще как это делается? :) Желательно примеры кода или сцылки…

Так же очень волнует вопрос будет ли такая возможность после упаковки все py2exe
igor.kaist
http://python.su/blog/public/2008/09/17/podderzhka-plaginov-v-programmah-na-python/
http://jenyay.net/Programming/PyPlugins

После упаковки в py2exe все работает нормально, проверено лично.
expee
Может import?
ZZZ
Скорее __import__. Я как-то делал подобное и статьи, показаммые Игорем, мне очень даже пригодились.
Ещё на pypi было что-то готовое для этих целей…
Zubchick
о, здорово, как то я их проглядел :)
Благодарю.
Zubchick
Поднимаю вопрос с новой силой :)
По статье выше мы успешно импортируем все плагины, создаем экземпляры классов и выполняем како-нибудь метод. Теперь же мне нужно импортировать сам класс, чтобы потом клепать его экземпляры.

Примерно то что нужно сделать: импортировать все файлы-плагины, на каждый класс создать кнопочку в окошке и чтобы при нажатии на эту кнопочку создавался новый экземпляр этого касса +)

Ума не приложу как так сделать…
Zubchick
Сам спросил, сам ответил :)
А что если один из вызываемых методов будет возвращать сам класс? cls или селф там… Прокатит?
igor.kaist
Вот кусочек кода из моего текущего проекта, где как раз делаю тоже самое.
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()
как то вот так….
Zubchick
cl=getattr (obj, ‘Plugin’)(self)

что делает эта строчка? Можно поконкретнее :)
Получаем класс Plugin из obj, а что такое (self) еще?
igor.kaist
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()
P.S. Меня за это наверное кто нибудь будет пинать :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB