PyInstaller打包Kivy应用后图片缺失问题求助
PyInstaller打包Kivy应用后部分图片无法加载的问题
我用PyInstaller打包Kivy应用后,程序能正常运行,但部分图片(比如minus.png)没被正确打包,虽然已经用--add-data参数添加了。终端一直报minus.png找不到的错误,下面是我的spec文件和运行日志,求帮忙排查。
我的spec文件
# -*- mode: python ; coding: utf-8 -*- from kivy_deps import sdl2, glew block_cipher = None a = Analysis( ['main.py'], pathex=[], binaries=[], datas=[('images\billiards-icon-7.png', '.\images'), ('images\minus.png', '.\images'), ('billiardsclub.kv', '.')], hiddenimports=[], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False, ) 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='billiards', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=True, disable_windowed_traceback=False, argv_emulation=False, target_arch=None, codesign_identity=None, entitlements_file=None, icon=['images\billiards-icon-7.ico'], )
应用运行时终端日志
[INFO ] [Logger ] Record log in C:\Users\bida\.kivy\logs\kivy_23-04-26_9.txt [INFO ] [Kivy ] v2.1.0 [INFO ] [Kivy ] Installed at "C:\Users\bida\AppData\Local\Temp\_MEI160762\kivy\__init__.pyc" [INFO ] [Python ] v3.10.5 (tags/v3.10.5:f377153, Jun 6 2022, 16:14:13) [MSC v.1929 64 bit (AMD64)] [INFO ] [Python ] Interpreter at "C:\Users\bida\PycharmProjects\billiards\dist\billiards.exe" [INFO ] [Logger ] Purge log fired. Processing... [INFO ] [Logger ] Purge finished! [INFO ] [Factory ] 189 symbols loaded [INFO ] [Image ] Providers: img_tex, img_dds, img_sdl2 (img_pil, img_ffpyplayer ignored) [INFO ] [Window ] Provider: sdl2 [INFO ] [GL ] Using the "OpenGL" graphics system [INFO ] [GL ] GLEW initialization succeeded [INFO ] [GL ] Backend used <glew> [INFO ] [GL ] OpenGL version <b'4.6.0 - Build 31.0.101.2114'> [INFO ] [GL ] OpenGL vendor <b'Intel'> [INFO ] [GL ] OpenGL renderer <b'Intel(R) UHD Graphics 620'> [INFO ] [GL ] OpenGL parsed version: 4, 6 [INFO ] [GL ] Shading version <b'4.60 - Build 31.0.101.2114'> [INFO ] [GL ] Texture max size <16384> [INFO ] [GL ] Texture max units <32> [INFO ] [Window ] auto add sdl2 input provider [INFO ] [Window ] virtual keyboard not allowed, single mode, not docked [INFO ] [Text ] Provider: sdl2 [ERROR ] [Image ] Not found <.\images\minus.png> [INFO ] [GL ] NPOT texture support is available [ERROR ] [Image ] Not found <.\images\minus.png> [ERROR ] [Image ] Not found <.\images\minus.png> [ERROR ] [Image ] Not found <.\images\minus.png> [ERROR ] [Image ] Not found <.\images\minus.png> [ERROR ] [Image ] Not found <.\images\minus.png> [ERROR ] [Image ] Not found <.\images\minus.png> [ERROR ] [Image ] Not found <.\images\minus.png> [ERROR ] [Image ] Not found <.\images\minus.png> [ERROR ] [Image ] Not found <.\images\minus.png> [ERROR ] [Image ] Not found <.\images\minus.png> [ERROR ] [Image ] Not found <.\images\minus.png> [INFO ] [Base ] Start application main loop
问题排查与解决办法
修复路径转义字符问题
Python字符串中反斜杠\是转义字符,会导致路径解析错误(比如\m会被识别为特殊字符)。把spec文件中所有路径的反斜杠替换为正斜杠/或双反斜杠\\:
修改后的datas配置:datas=[('images/billiards-icon-7.png', './images'), ('images/minus.png', './images'), ('billiardsclub.kv', '.')],图标路径同步修改:
icon=['images/billiards-icon-7.ico'],统一资源加载路径
打包后程序会运行在临时目录,直接用相对路径无法找到资源。在main.py开头添加资源路径获取函数:import os import sys def resource_path(relative_path): """获取资源文件的绝对路径,兼容开发与打包环境""" try: base_path = sys._MEIPASS # 打包后的临时目录 except Exception: base_path = os.path.abspath(".") # 开发环境下的项目根目录 return os.path.join(base_path, relative_path)加载图片时替换为该函数返回的路径:
# 示例:替换原有的图片路径引用 minus_img_path = resource_path('images/minus.png')验证资源打包情况
打包后打开dist文件夹,检查images目录下是否存在minus.png。如果不存在,说明spec文件的datas配置仍有问题,需再次核对源文件路径是否正确。重新打包
修改spec文件后,执行pyinstaller your_spec_file.spec重新打包,确保新配置生效。
内容的提问来源于stack exchange,提问作者newpy
相关产品推荐
相关产品推荐

