使用 Python 3.10 修复 Kivy 应用程序中的 PyInstaller 启动崩溃

PyInstaller

了解使用 PyInstaller 构建的 Kivy 应用程序中的启动崩溃

使用 PyInstaller 构建 Kivy 应用程序是将 Python 应用程序打包成独立可执行文件的常见方法。然而,尽管构建过程成功,但开发人员在启动打包应用程序时有时会遇到意外崩溃。当没有提供详细的错误消息时,这个问题可能会特别令人沮丧。

在这种情况下,应用程序在开发环境(例如 PyCharm)中完美运行,但在使用 PyInstaller 打包时失败。对于 Kivy 2.3.0、Python 3.10 等依赖项以及 numpy、scipy 和 pandas 等库,识别崩溃源对于解决问题至关重要。

没有明确跟踪的“意外错误”之类的错误通常表明缺少依赖项、不正确的 SPEC 文件配置或虚拟环境不一致。鉴于确保正确捆绑所有必要文件的重要性,检查 PyInstaller SPEC 文件和运行时依赖项是至关重要的一步。

本文探讨了崩溃的可能原因,重点是改进 SPEC 文件、管理隐藏导入以及确保在构建过程中正确处理必要的 Kivy 依赖项。

命令 使用示例
Analysis() 此命令初始化 PyInstaller 分析过程,指定要捆绑的 Python 脚本以及在何处查找依赖项。它对于配置应用程序的打包方式至关重要,包括隐藏导入和外部数据(例如二进制文件和 JSON 文件)。
hiddenimports Analysis() 中的参数用于手动指定 PyInstaller 可能无法自动检测的 Python 包(例如 numpy、pandas 等),从而防止与缺少库相关的运行时错误。
Tree() 此命令在 COLLECT 步骤中使用,以确保整个目录(例如 sdl2.dep_bins 和 glew.dep_bins)包含在最终构建中。它确保应用程序包含图形和声音所需的 Kivy 依赖项。
COLLECT() 将所有已编译的文件、二进制文件和依赖项收集到一个输出目录中。它确保所有资源、库和文件都正确捆绑在一起以进行分发。
datas 用于在捆绑的应用程序中包含特定文件(例如生成的 data.json)。当使用外部资源(例如 Kivy 应用程序中 JsonStore 创建的 JSON 文件)时,这一点至关重要。
JsonStore() 用于存储和管理 JSON 格式数据的特定 Kivy 命令。有必要在 PyInstaller 数据配置中显式包含任何生成的文件,以避免打包后丢失文件的问题。
upx=True 此选项在打包过程中启用二进制文件的 UPX 压缩。虽然它减少了生成的可执行文件的大小,但有时会导致兼容性问题,因此请谨慎启用。
strip=False 禁止从二进制文件中剥离调试符号。它对于诊断启动问题和跟踪运行时错误非常有用,特别是当应用程序崩溃且错误输出最少时。
bootloader_ignore_signals 确保 PyInstaller 的引导加载程序将忽略 SIGTERM 等操作系统信号的标志。这可以防止应用程序在启动过程中过早终止,这可能是意外崩溃的原因之一。

使用 PyInstaller 排除 Kivy 应用程序启动错误

上面提供的脚本专注于解决一个非常具体的问题:使用 PyInstaller 构建的 Kivy 应用程序在启动时崩溃并出现“意外错误”。第一个脚本解决了缺失的潜在问题 。这是使用 PyInstaller 时的一个常见问题,因为它不会自动检测所有依赖项,尤其是像这样的库 , , 或者 scipy。通过手动指定这些隐藏的导入 SPEC 文件部分,我们确保 PyInstaller 捆绑所有必要的模块,防止应用程序因缺少组件而崩溃。

脚本中的第二个重要步骤是包含 在 阶段。此命令可确保应用程序与 Kivy 相关的依赖项(例如 SDL2 和 GLEW 库)正确包含在构建中。这些对于渲染应用程序的图形界面至关重要。如果不包含这些文件,即使构建过程顺利完成,Kivy 应用程序也将无法正常运行。确保包含这些二进制文件有助于避免与缺少图形或声音组件相关的运行时问题。

该脚本还解决了外部文件的包含问题,例如由 在基维。虽然此 JSON 文件是在运行时生成的,但确保在打包过程中正确处理它至关重要。这 论据中的 函数允许我们显式地将此文件包含在捆绑的应用程序中。通过这样做,我们可以避免在初始化过程中由于缺少外部数据文件而导致应用程序崩溃的错误。

最后,我们还看到了 UPX 压缩的使用以及 选项。 UPX 压缩用于减小捆绑应用程序的大小,使分发更容易。然而,启用 UPX 有时会导致兼容性问题,这就是为什么它与 以避免从二进制文件中删除调试符号。通过保留调试符号,我们可以更好地跟踪运行时任何崩溃或错误的原因。禁用窗口回溯是另一种有助于诊断问题的配置,因为它允许错误消息出现在控制台中,从而提供对启动时潜在问题的洞察。

处理 Kivy 应用程序的 PyInstaller 构建中缺少的依赖项

Python 后端解决方案,重点解决 PyInstaller 中的隐藏导入问题

# Step 1: Modify the SPEC file to include hidden imports manually
# Import necessary dependencies from Kivy, sdl2, and glew
from kivy_deps import sdl2, glew
# Add numpy, pandas, scipy to hidden imports manually
a = Analysis([r'path_to_your_app.py'],
             pathex=['.'],
             binaries=[],
             datas=[],
             hiddenimports=['numpy', 'pandas', 'scipy'],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             noarchive=False)
# Add Tree() for all Kivy dependencies to the collect step
coll = COLLECT(exe, Tree('C:\\path_to_project'),
               a.binaries, a.zipfiles, a.datas,
               *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
               strip=False, upx=True, name='Prototype')

在 Kivy PyInstaller 构建中管理 JSONStore 和数据文件

使用 PyInstaller 处理 JSONStore 和数据文件包含的 Python 后端解决方案

# Step 2: Ensure that the generated JSON file from kivy.storage.jsonstore is included
from kivy.storage.jsonstore import JsonStore
# If JSONStore is used, manually add the JSON file to the build
store = JsonStore('data.json')
# Create the SPEC file to explicitly include the JSON data
datas=[('data.json', '.')],
a = Analysis([r'path_to_your_app.py'],
             pathex=['.'],
             binaries=[],
             datas=[('data.json', '.')],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             noarchive=False)
coll = COLLECT(exe, Tree('C:\\path_to_project'),
               a.binaries, a.zipfiles, a.datas,
               *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
               strip=False, upx=True, name='Prototype')

优化 Kivy 应用程序的 PyInstaller 以防止启动错误

使用 PyInstaller 和 Kivy 时,需要考虑的一个关键方面是外部依赖项和库的管理。 PyInstaller 的默认行为有时会忽略某些库或文件,尤其是在使用更复杂的设置(例如虚拟环境或科学库)时 和 。确保所有隐藏的导入都在 参数很关键。此外,PyInstaller 可能不会自动包含图形和多媒体依赖项,例如来自 sdl2 或者 ,这两者对于 Kivy 应用程序都是必不可少的。

开发人员经常忽视的另一个方面与虚拟环境有关。在虚拟环境中使用 PyInstaller 构建 Kivy 应用程序时,确保正确捆绑所有依赖项非常重要。这涉及到调整 设置指向安装库的正确目录。如果不这样做,可能会导致打包的应用程序在开发环境中运行良好,但在生产环境中启动时崩溃。通过全面检查构建配置并确保所有路径和依赖项都正确,通常可以避免此问题。

最后,正确处理图像、字体和数据文件等资源对于防止意外启动错误至关重要。在 Kivy 应用程序中,经常需要外部资源,如果这些资源没有明确包含在 PyInstaller 中 部分,当尝试访问丢失的文件时,应用程序可能会在初始化期间崩溃。必须验证应用程序在运行时所需的所有文件是否已正确包含在最终版本中。

  1. 为什么我的 Kivy 应用程序在使用 PyInstaller 构建后崩溃?
  2. 最常见的原因是缺少依赖项。确保所有必要的库,例如 , , 和 ,作为隐藏导入包含在 PyInstaller SPEC 文件中。
  3. 如何在我的构建中包含 sdl2 和 glew 依赖项?
  4. 使用 函数在 步骤包括 sdl2 和 glew 二进制文件。这些是 Kivy 的图形操作所必需的。
  5. PyInstaller可以正确处理虚拟环境吗?
  6. 可以,但是必须设置正确 在 SPEC 文件中指向安装依赖项的环境,否则应用程序可能无法找到它们。
  7. 如果我的应用程序在 PyCharm 中运行但打包时崩溃了,我该怎么办?
  8. 确保包含所有运行时依赖项,并验证 SPEC 文件中的 部分包含应用程序使用的所有必需文件,例如字体、图像或 JSON 数据。
  9. 如何在不进行回溯的情况下解决“意外错误”消息?
  10. 设置 参数为 在 步。这会将错误输出到终端,使您能够追踪崩溃的原因。

总结 PyInstaller 崩溃的解决方案

在本指南中,我们研究了为什么 Kivy 应用程序在使用 PyInstaller 构建时可能会崩溃,尽管在开发环境中完美运行。解决诸如缺少库、不正确捆绑数据或依赖项配置错误等问题有助于防止这些崩溃。

通过仔细调整 SPEC 文件、管理隐藏导入并确保包含所有资源和依赖项,您可以成功打包 Kivy 应用程序。正确处理这些细节将确保您的应用程序在使用 PyInstaller 构建后无缝运行。

  1. 解释常见 PyInstaller 打包问题的解决方案,包括隐藏导入和依赖项管理。 PyInstaller官方文档
  2. 提供有关在构建应用程序时处理 Kivy 特定依赖项(例如 SDL2 和 GLEW)的信息。 Kivy 文档:打包您的应用程序
  3. 讨论虚拟环境中的故障​​排除问题,特别是复杂的 Python 库(如 numpy 和 pandas)。 Stack Overflow:PyInstaller 和 Kivy 错误