Компиляция приложения Kivy в исполняемый файл Windows - PullRequest
0 голосов
/ 25 июня 2018

Я боролся с PyInstaller на прошлой неделе, пытаясь собрать мое приложение в один исполняемый файл.

Я пробовал несколько разных реализаций с файлом .spec, и из множества методов, которые я пробую, я могу либо заставить его скомпилироваться в один исполняемый файл, который сразу падает при запуске, вообще не запускается, либо работает, но очень медленно. Ничто по сравнению с тем, когда я запускаю его из PyCharm.

Я не уверен, что медленная скорость запуска вызвана компилятором или чем-то, но выполнение задачи занимает примерно 1-2 секунды, когда я запускаю ее через PyCharm, однако, когда она запускается из исполняемого файла, она занимает около 30-35 секунд, и приложение зависает.

Мое приложение по существу берет некоторый текст из блоков TextInput, извлекает из них текстовые значения, выполняет некоторые SQL-запросы, а затем отправляет необходимую информацию для обновления / добавления информации о входе в базу данных доступа.

Мой последний файл .spec выглядит следующим образом:

# -*- mode: python -*-

import pyodbc

from datetime                   import date
from kivy.app                   import App
from kivy.uix.button            import Button
from kivy.uix.boxlayout         import BoxLayout
from kivy.uix.label             import Label
from kivy.uix.popup             import Popup
from kivy.uix.textinput         import TextInput
from kivy.lang                  import Builder
from kivy.properties            import BooleanProperty, ObjectProperty
from kivy.deps import sdl2, glew

block_cipher = None


a = Analysis(['DBInterfaceAssistant.py'],
             pathex=['C:\\Python36-32'],
             binaries=[],
             datas=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name='DBInterfaceAssistant',
          debug=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=False )

Продуктом этого приложения является приложение, которое не запускается, оно пытается загрузить приложение, но сразу падает.

--- EDIT ---

Мой текущий скрипт сборки выглядит следующим образом:

# -*- mode: python -*-

import pyodbc

from datetime                   import date
from kivy.app                   import App
from kivy.uix.button            import Button
from kivy.uix.boxlayout         import BoxLayout
from kivy.uix.label             import Label
from kivy.uix.popup             import Popup
from kivy.uix.textinput         import TextInput
from kivy.lang                  import Builder
from kivy.properties            import BooleanProperty, ObjectProperty
from kivy.deps import sdl2, glew
from kivy.tools.packaging.pyinstaller_hooks import get_deps_minimal, get_deps_all, hookspath, runtime_hooks

block_cipher = None


a = Analysis(['DBInterfaceAssistant.py'],
             pathex=['C:\\Python36-32'],
             binaries=[],
             datas=[],
             hookspath=hookspath(),
             runtime_hooks=runtime_hooks(),
             ** get_deps_all())
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
          name='DBInterfaceAssistant',
          debug=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=False )

1 Ответ

0 голосов
/ 25 июня 2018

Вы можете использовать пример из Kivy документов:

from kivy.tools.packaging.pyinstaller_hooks import get_deps_minimal, get_deps_all, hookspath, runtime_hooks
a = Analysis(['examples-path\\demo\\touchtracer\\main.py'],
         ...
         hookspath=hookspath(),
         runtime_hooks=runtime_hooks(),
         ...
         **get_deps_all())

coll = COLLECT(exe, Tree('examples-path\\demo\\touchtracer\\'),
           a.binaries,
           a.zipfiles,
           a.datas,
           *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
           strip=False,
           upx=True,
           name='touchtracer')

https://kivy.org/docs/guide/packaging-windows.html#overwrite-win-hook

...