【问题标题】:Compiling Kivy application to Windows Executable将 Kivy 应用程序编译为 Windows 可执行文件
【发布时间】:2018-06-25 13:05:22
【问题描述】:

过去一周我一直在与 PyInstaller 作斗争,试图让我的应用程序编译成单个可执行文件。

我已经用 .spec 文件尝试了几种不同的实现,在我尝试的许多方法中,我可以让它编译成一个在启动时立即崩溃、根本不启动的可执行文件,或者它运行,但速度极慢。与我用 PyCharm 运行它时相比,没有什么可比的。

我不确定运行速度慢是因为编译器还是什么,但是当我通过 PyCharm 运行执行任务时,它运行大约需要 1-2 秒,但是当它从可执行文件运行时它大约需要 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 )

这个产品是一个无法启动的应用程序,它尝试加载应用程序但立即崩溃。

---编辑---

我当前的构建脚本如下:

# -*- 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 )

【问题讨论】:

    标签: python python-3.x kivy pyinstaller


    【解决方案1】:

    您可以使用 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

    【讨论】:

    • 所以,有了这个可执行文件,我需要它是一个文件。 PyInstaller 提供的示例并未将其格式化为一个文件包。这个方法我试过了,效果很好,但是由于一些网络安全限制,目录输出是不可接受的。
    • 你能用你当前的构建脚本更新这个问题吗?
    • 已更新。抱歉,我今天比较忙。
    • 你仍然缺少 hookspath/runtime_hooks/get_deps_all 部分...在Analysis
    • 使用上述选项编译后,程序运行。但是,在执行应用程序的预期功能时,它会出错并指出:“致命错误:无法执行脚本 DBInterfaceAssistant。”
    猜你喜欢
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多