Рубрики
Без рубрики

Учебник Pyinstaller – построить двоичные серии!

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

В нашей предыдущей статье на строительные двоичные двоики мы немного узнали о PY2EXE. На этот раз мы будем сосредоточиться на нашем коллективном внимании на ins и outs of Pyinstaller. Мы будем использовать один и тот же скрипт lame wxpython из последней статьи для одного из наших примеров, но мы также попробуем обычный скрипт консоли, чтобы увидеть, какие различия, если таковые имеются. Если вы не знали, Pyinstaller работает на Linux, Windows и Mac (ExperireLental) и работает с Python 1.5-2.6 (кроме Windows, где есть предостережение для 2.6 – см. Ниже). Pyinstaller поддерживает подписание кода (Windows), яйца, скрытые импорта, один исполняемый файл, один каталог и многое другое!

Начало работы с Pyinstaller

Примечание на Python 2.6 на Windows: Если вы прочитаете Pyinstaller Сайт Тесно, вы увидите предупреждение о Python 2.6+, не полностью поддерживаемым. Примечание говорит, что вам в настоящее время необходимо установить Microsoft Crt для выполнения вашего исполняемого файла. Это, вероятно, имеет в виду, – это проблемы со стороны сборок/проявляются проблемы, которые были введены с Python 2.6 VIS-VI-VIS Microsoft Visual Studio 2008. Мы уже упомянули эту проблему в первой статье. Если вы ничего не знаете об этом, пожалуйста, проверьте веб-сайт PY2EXE, WXPYPHON Wiki или Google для этой проблемы.

Во всяком случае, давайте продолжим с шоу. После того, как вы скачаете Pyinstaller, вы просто расстегните архив где-то удобны. Следуйте эти три простых шага:

  1. Беги Configure.py . Чтобы сохранить некоторые базовые данные конфигурации в файл «.dat». Это экономит некоторое время, поскольку Pyinstaller не придется пересчитать конфигурацию на лету.
  2. Запустите следующую команду в командной строке: Python MadePec.py [Opts] Там, где ScriptName – это имя основного файла Python, который вы используете для запуска вашей программы.
  3. Наконец, запустите следующую команду через командную строку: Python Build.py Specfile построить свой исполняемый файл.

Давайте пройдем через это с настоящим сценарием сейчас. Начнем с простого консольного скрипта, который создает файл конфигурации FAUX. Вот код:

import configobj

#----------------------------------------------------------------------
def createConfig(configFile):
    """
    Create the configuration file
    """
    config = configobj.ConfigObj()
    inifile = configFile
    config.filename = inifile
    config['server'] = "http://www.google.com"
    config['username'] = "mike"
    config['password'] = "dingbat"
    config['update interval'] = 2
    config.write()
    
#----------------------------------------------------------------------
def getConfig(configFile):
    """
    Open the config file and return a configobj
    """    
    return configobj.ConfigObj(configFile)

def createConfig2(path):
    """
    Create a config file
    """
    config = configobj.ConfigObj()
    config.filename = path
    config["Sony"] = {}
    config["Sony"]["product"] = "Sony PS3"
    config["Sony"]["accessories"] = ['controller', 'eye', 'memory stick']
    config["Sony"]["retail price"] = "$400"
    config.write()

if __name__ == "__main__":
    createConfig2("sampleConfig.ini")

Теперь давайте сделаем SPEC-файл:

C: \ python25 \ python c: \ users \ mike \ desktop \ pyinstaller-1.4 \ madepec.py config_1.py

На моем тестовом компьютере у меня установлена 3 разных версиях Python, поэтому я должен был указать путь Python 2.5 явно (или установить Python 2.5 в качестве по умолчанию). В любом случае, это должно создать файл, аналогичный следующему (который был назван «config_1.spec»):

# -*- mode: python -*-
a = Analysis([os.path.join(HOMEPATH,'support\\_mountzlib.py'), os.path.join(HOMEPATH,'support\\useUnicode.py'), 'config_1.py'],
             pathex=['C:\\Users\\Mike\\Desktop\\py2exe_ex', r'C:\Python26\Lib\site-packages'])
pyz = PYZ(a.pure)
exe = EXE(pyz,
          a.scripts,
          exclude_binaries=1,
          name=os.path.join('build\\pyi.win32\\config_1', 'config_1.exe'),
          debug=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT( exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name=os.path.join('pyInstDist2', 'config_1'))

Для сценария Python мы используем, нам нужно добавить явный путь к расположению configobj.py В Анализ Раздел SPEC файла в Pathex параметр. Если вы этого не сделаете, при запуске получаемого исполняемого исполняемого файла он будет открываться и закрывать окно консоли действительно быстро, и вы не сможете сказать, что он говорит, если вы не запустите EXE из командной строки. Я сделал последнее, чтобы выяснить, что было неверным и обнаружено, что он не мог найти модуль Configobj. Вы также можете указать выходной путь для вашего EXE в параметре «Собирайте имя» функции. В этом случае мы поставьте выход Pyinstaller в подпапке «Config_1» «Pyinstdist2», что должно быть папкой рядом с вашим оригинальным сценарием. При настройке вашего SPECHENT предлагается тонна параметров, которые вы можете прочитать о здесь Отказ

Чтобы создать исполняемый файл на основе файла SPEC, выполните следующие действия в командной строке:

C: \ python25 \ python c: \ Пользователи \ mike \ desktop \ pyinstaller-1.4 \ build.py config_1.spec

На моей машине я оказался папкой, которая имела в ней 25 файлов, которые составили 6,7 МБ. Вы должны уметь уменьшить размер, используя раздел «Анализ» исключает параметр и/или сжатие.

Pyinstaller и wxpython.

Теперь давайте попробуем создать двоичный с помощью простого сценария WXPYPHON. Вот сценарий Python:

import wx

########################################################################
class DemoPanel(wx.Panel):
    """"""
    
    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)
        
        labels = ["Name", "Address", "City", "State", "Zip",
                  "Phone", "Email", "Notes"]
        
        mainSizer = wx.BoxSizer(wx.VERTICAL)
        lbl = wx.StaticText(self, label="Please enter your information here:")
        lbl.SetFont(wx.Font(12, wx.SWISS, wx.NORMAL, wx.BOLD))
        mainSizer.Add(lbl, 0, wx.ALL, 5)
        for lbl in labels:
            sizer = self.buildControls(lbl)
            mainSizer.Add(sizer, 1, wx.EXPAND)
        self.SetSizer(mainSizer)
        mainSizer.Layout()
        
    #----------------------------------------------------------------------
    def buildControls(self, label):
        """"""
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        size = (80,40)
        font = wx.Font(12, wx.SWISS, wx.NORMAL, wx.BOLD)
        
        lbl = wx.StaticText(self, label=label, size=size)
        lbl.SetFont(font)
        sizer.Add(lbl, 0, wx.ALL|wx.CENTER, 5)
        if label != "Notes":
            txt = wx.TextCtrl(self, name=label)
        else:
            txt = wx.TextCtrl(self, style=wx.TE_MULTILINE, name=label)
        sizer.Add(txt, 1, wx.ALL, 5)
        return sizer
    
    

########################################################################
class DemoFrame(wx.Frame):
    """
    Frame that holds all other widgets
    """

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""        
        wx.Frame.__init__(self, None, wx.ID_ANY, 
                          "PyInstaller Tutorial",
                          size=(600,400)
                          )
        panel = DemoPanel(self)        
        self.Show()
        
#----------------------------------------------------------------------
if __name__ == "__main__":
    app = wx.App(False)
    frame = DemoFrame()
    app.MainLoop()

Поскольку это GUI, мы создадим наш SPEC-файл немного по-разному:

C: \ python25 \ python c: \ users \ mike \ desktop \ pyinstaller-1.4 \ madepec.py -f -w sampleapp.py

Обратите внимание на параметры -f и -w. Команда -F Command сообщает Pyinstaller создавать только один исполняемый файл, тогда как «w »сообщает Pyinstaller, чтобы скрыть консольное окно. Вот итоговый файл SPEC:

# -*- mode: python -*-
a = Analysis([os.path.join(HOMEPATH,'support\\_mountzlib.py'), os.path.join(HOMEPATH,'support\\useUnicode.py'), 'sampleApp.py'],
             pathex=['C:\\Users\\Mike\\Desktop\\py2exe_ex'])
pyz = PYZ(a.pure)
exe = EXE( pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name=os.path.join('pyInstDist', 'sampleApp.exe'),
          debug=False,
          strip=False,
          upx=True,
          console=False )

Обратите внимание, что последняя строка имеет параметр «Console», установленный на «False». Если вы построете это, как вы сделали с помощью скрипта консоли, вы должны в конечном итоге с одним файлом в папке «Pyinstdist» размером примерно 7,1 МБ.

Обертывание

Это заканчивает наш быстрый тур по Pyinstaller. Я надеюсь, что вы нашли это полезно в ваших усилиях на двоичных питонах. На сайте Pyinstaller гораздо больше информации и довольно хорошо документировано, хотя веб-сайт довольно простой. Обязательно попробуйте посмотреть, насколько легко использовать Pyinstaller!

Примечание. Я проверил все это с помощью Pyinstaller 1.4 и Python 2.5 на Windows 7 Home Premium (32-Bit).

Дальнейшее чтение