Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 17, 2010 14:32:41

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Подключение папки с плагинами

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

Так же очень волнует вопрос будет ли такая возможность после упаковки все py2exe



Офлайн

#2 Янв. 17, 2010 14:43:51

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Подключение папки с плагинами

http://python.su/blog/public/2008/09/17/podderzhka-plaginov-v-programmah-na-python/
http://jenyay.net/Programming/PyPlugins

После упаковки в py2exe все работает нормально, проверено лично.



Офлайн

#3 Янв. 17, 2010 16:24:54

expee
От:
Зарегистрирован: 2009-12-21
Сообщения: 197
Репутация: +  0  -
Профиль   Отправить e-mail  

Подключение папки с плагинами

Может import?



Офлайн

#4 Янв. 17, 2010 16:47:14

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Подключение папки с плагинами

Скорее __import__. Я как-то делал подобное и статьи, показаммые Игорем, мне очень даже пригодились.
Ещё на pypi было что-то готовое для этих целей…



Офлайн

#5 Янв. 17, 2010 18:25:57

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Подключение папки с плагинами

о, здорово, как то я их проглядел :)
Благодарю.



Офлайн

#6 Апрель 19, 2010 09:35:24

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Подключение папки с плагинами

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

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

Ума не приложу как так сделать…



Офлайн

#7 Апрель 19, 2010 09:38:41

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Подключение папки с плагинами

Сам спросил, сам ответил :)
А что если один из вызываемых методов будет возвращать сам класс? cls или селф там… Прокатит?



Офлайн

#8 Апрель 19, 2010 10:29:40

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Подключение папки с плагинами

Вот кусочек кода из моего текущего проекта, где как раз делаю тоже самое.

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()
как то вот так….



Офлайн

#9 Апрель 19, 2010 10:39:43

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Подключение папки с плагинами

cl=getattr (obj, ‘Plugin’)(self)

что делает эта строчка? Можно поконкретнее :)
Получаем класс Plugin из obj, а что такое (self) еще?



Офлайн

#10 Апрель 19, 2010 10:56:53

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Подключение папки с плагинами

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. Меня за это наверное кто нибудь будет пинать :)



Отредактировано (Апрель 19, 2010 11:17:25)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version