Плагины и py2exe
Делаем exe-шник
Лично для меня одним из важных преимуществ Python по сравнению с некоторыми другими языками (не будем показывать пальцами) является то, что благодаря библиотеки py2exe под Windows возможно сделать запускаемый exe-шник. При этом пользователь не обязан устанавливать Python, чтобы запустить вашу программу. Сейчас мы научимся работать с плагинами и в том случае, если программа распространяется в виде windows-приложения.
Для начала рассмотрим простой пример, состоящий из основного скрипта main.py и одного плагина, расположенного в папке plugins.
Основной скрипт:
PHP код:
#-*- coding: utf-8 -*-
modulename = "plugin"
classname = "pluginClass"
package_obj = __import__("plugins." + modulename )
print dir(package_obj)
module_obj = getattr (package_obj, modulename)
print dir (module_obj)
obj = getattr (module_obj, classname)
if issubclass (obj, object):
a = obj()
a.run()
else:
print "Not class"
И исходник плагина:
PHP код:
#-*- coding: utf-8 -*-
class pluginClass (object):
def __init__(self):
pass
def run (self):
print "Hello, Plugin!"
Для того, чтобы сделать exe-шник напишем скрипт (назовем его setup.py), содержащий следующей код (более подробно смотрите в документации к py2exe):
PHP код:
from distutils.core import setup
import py2exe
setup ( console = ['main.py'])
И запустим скрипе setup.py с параметром py2exe:
Код:
C:\Python25\python.exe setup.py py2exe
После выполнения скрипта будет создана папка dist, где будут находиться наш exe-шник и дополнительные файлы. Про один из них - library.zip надо рассказать поподробнее. Внутри этого файла располагаются все необходимые для работы скрипта файлы *.pyc (скомпилированные в байт-код модули). Именно там при выполнении команды import foo Python будет искать модуль foo (foo.pyc). Таким образом, если мы хотим добавить пакет plugins, то должны создать папку plugins внутри архива library.zip. Скачать пример, демонстрирующий сказанное выше можно по ссылке - py2exe_test_1.zip (около 2 МБ). В папке dist располагается уже готовый exe-шник, а внутри архива library.zip находится пакет с одним плагином.
Если запустить файл main.exe, то в консоли увидим следующее:
Код:
['__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__path__', 'plugin']
['__builtins__', '__doc__', '__file__', '__loader__', '__name__', 'pluginClass']
Hello, Plugin!
Избавляемся от library.zip
С точки зрения обычного пользователя неудобно, что для добавления нового плагина надо работать с архивом. К счастью, py2exe позволяет скомпилированные модули располагать не в архиве, а просто в отдельной папке. Для этого скрипт установки setup.py должен выглядеть примерно так:
from distutils.core import setup
import py2exe
Код:
setup ( console = ['main.py'], zipfile = '.', options = {"py2exe": {"skip_archive":1}})
В options мы добавляем новый параметр skip_archive, который относится к py2exe. Этот параметр указывает, что сборки не надо архивировать. Путь, где будут лежать сборки указываем в параметре zipfile. В данном случае модули будут располагаться в одной папке с созданным exe-шником. Если не используется параметр skip_archive, то через параметр zipfile можно изменить имя архива, в котором содержатся модули (по умолчанию library.zip).
Скачать пример с таким сбособом создания exe-шника можно по ссылке - py2exe_test_2.zip (около 1.6 МБ). В нем папка plugins располагается рядом с файлом main.exe и пользователю достаточно скопировать в эту папку новый подключаемый плагин.
Плагины и дополнительные модули
Давайте теперь сделаем полноценное приложение из примера, рассмотренного в разделе "Второй пример, приближенный к реальности", но с небольшим усложнением. Предположим, что один из плагинов импортирует другой модуль Python, который не импортирует основная программа. Путь, для примера, одному из плагинов понадобится библиотека wxPython. В этом случае его код будет выглядеть вот так:
PHP код:
#-*- coding: utf-8 -*-
import base
import wx
class wxpluginClass (base.baseplugin):
def __init__(self):
pass
def run (self):
print " Hello, WX!"
Если мы просто скопируем такой плагин в папку plugins, то во время работы получим ошибку о том, что невозможно импортировать модуль wx. Как один из выходов - обработать этот плагин с помощью py2exe и пользователю дать кроме самого файла плагина (не скомпилированного) те файлы, которые появятся в папке dist. Причем эти файлы надо будет скопировать не в папку plugins, а в папку, где располагается основной exe-шник.
Для этого в примере, который можно скачать по ссылке - py2exe_test_3.zip (около 3.6 МБ) в папке с исходником плагина есть еще один файл setup.py, который работает с плагином, импортирующий wx. В нем нет ничего принципиально нового.
Заключение
Итак, мы научились делать так, чтобы наша программа умела динамически загружать модули (плагины) и сделали полноценное приложение под Windows, которое в качестве плагинов использует исходники на Python. Вот, собственно, и все, что хотелось бы рассказать
