![]() |
Делаем плагины на Python
http://jenyay.net/Programming/PyPlugins
Делаем плагины на Python Введение Многие программы поддерживают так называемые плагины (дополнение, расширения и т.п.), с помощью которых можно расширять функциональность программы. На Python делать программы, поддерживающие плагины особенно легко и приятно. Потому что с одной стороны с качестве плагина могут выступать полноценные классы, а с другой стороны благодаря кроссплатформенности языка Python плагины так же остаются кроссплатформенными. Давайте посмотрим что нужно сделать, чтобы ваша программа тоже поддерживала плагины. Заодно убедимся как это легко. Первый пример. Основные функции Вначале давайте договоримся о структуре тестовых примеров. Модуль основной программы будет называться main.py, а плагины будут лежать в папке plugins, располагающейся рядом с этим файлом. Чтобы Python принял plugins за пакет, в нем должен находиться файл с именем __init__.py (в нашем случае он будет пустым). Сначала представим, что динамически во время выполнения программы нам не нужно узнавать имя плагина и мы его знаем на этапе программирования. Пусть плагин имеет имя my_plugin.py и располагается в папке plugins. И пусть внутри файла my_plugin.py находится класс pluginClass, который содержит всю функциональность плагина. Вот его код: PHP код:
PHP код:
Импорт модуля плагина Аналогом встроенной директивы import является функция __import__ , она позволяет импортировать модули, имена которых на этапе написания программы неизвестны. У функции __import__ пять параметров, но обязательным является только первый. Необязательные параметры в данной статье мы использовать не будем, поэтому про них умолчим. Итак, единственный обязательный параметр - это имя пакета или модуля, который мы хотим импортировать. Если импорт пройдет удачно, функция возвратит экземпляр класса, который хранит все импортированные элементы. Начнем с импортирования модуля. Директива import нам не поможет. Зато мы можем воспользоваться функцией __import__ . Аналогом первой строки из записанного выше примера будет следующий код: PHP код:
PHP код:
Код:
<module 'plugins' from 'H:\Projects\Tests\PyPlugins\test1\plugins\__init__.pyc'>PHP код:
Код:
['__builtins__', '__doc__', '__file__', '__name__', '__path__', 'my_plugin']PHP код:
Код:
<module 'plugins.my_plugin' from 'H:\Projects\Tests\PyPlugins\test1\plugins\my_plugin.pyc'>PHP код:
Код:
['__builtins__', '__doc__', '__file__', '__name__', '__path__', 'my_plugin_1', 'my_plugin_2']http://jenyay.net/uploads/Programming/PyPlugins/test1_1.zip Получаем доступ к классу Итак, модуль my_plugin мы загрузили. Осталось добраться до класса, который содержится внутри. Для этого воспользуемся уже знакомой нам функцией dir и убедимся, внутри действительно хранится наш класс: PHP код:
Код:
['__builtins__', '__doc__', '__file__', '__name__', 'pluginClass']PHP код:
PHP код:
И все вместе Теперь для наглядности сведем вместе весь код, что мы раньше написали. В комментариях после операторов print приведено то, что они выведут на экран. PHP код:
http://jenyay.net/uploads/Programming/PyPlugins/test1.zip |
Второй пример, приближенный к реальности
В этом примере мы заранее не будем знать ни имена модулей плагинов, ни имена классов, содержащихся внутри. А так же потребуем, чтобы все плагины были производными от базового класса baseplugin. В папке plugins кроме файла __init__.py лежат еще три модуля. Один из них с именем base.py содержит в себе базовый класс: PHP код:
PHP код:
PHP код:
PHP код:
Код:
Skip base.pyhttp://jenyay.net/uploads/Programming/PyPlugins/test3.zip |
Плагины и py2exe
Делаем exe-шник Лично для меня одним из важных преимуществ Python по сравнению с некоторыми другими языками (не будем показывать пальцами) является то, что благодаря библиотеки py2exe под Windows возможно сделать запускаемый exe-шник. При этом пользователь не обязан устанавливать Python, чтобы запустить вашу программу. Сейчас мы научимся работать с плагинами и в том случае, если программа распространяется в виде windows-приложения. Для начала рассмотрим простой пример, состоящий из основного скрипта main.py и одного плагина, расположенного в папке plugins. Основной скрипт: PHP код:
PHP код:
PHP код:
Код:
C:\Python25\python.exe setup.py py2exeЕсли запустить файл main.exe, то в консоли увидим следующее: Код:
['__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__path__', 'plugin']С точки зрения обычного пользователя неудобно, что для добавления нового плагина надо работать с архивом. К счастью, py2exe позволяет скомпилированные модули располагать не в архиве, а просто в отдельной папке. Для этого скрипт установки setup.py должен выглядеть примерно так: from distutils.core import setup import py2exe Код:
setup ( console = ['main.py'], zipfile = '.', options = {"py2exe": {"skip_archive":1}})Скачать пример с таким сбособом создания exe-шника можно по ссылке - py2exe_test_2.zip (около 1.6 МБ). В нем папка plugins располагается рядом с файлом main.exe и пользователю достаточно скопировать в эту папку новый подключаемый плагин. Плагины и дополнительные модули Давайте теперь сделаем полноценное приложение из примера, рассмотренного в разделе "Второй пример, приближенный к реальности", но с небольшим усложнением. Предположим, что один из плагинов импортирует другой модуль Python, который не импортирует основная программа. Путь, для примера, одному из плагинов понадобится библиотека wxPython. В этом случае его код будет выглядеть вот так: PHP код:
Для этого в примере, который можно скачать по ссылке - py2exe_test_3.zip (около 3.6 МБ) в папке с исходником плагина есть еще один файл setup.py, который работает с плагином, импортирующий wx. В нем нет ничего принципиально нового. Заключение Итак, мы научились делать так, чтобы наша программа умела динамически загружать модули (плагины) и сделали полноценное приложение под Windows, которое в качестве плагинов использует исходники на Python. Вот, собственно, и все, что хотелось бы рассказать :) |
| Время: 14:57 |