You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题排查与解决办法

  1. 修复路径转义字符问题
    Python字符串中反斜杠\是转义字符,会导致路径解析错误(比如\m会被识别为特殊字符)。把spec文件中所有路径的反斜杠替换为正斜杠/或双反斜杠\\:
    修改后的datas配置:

    datas=[('images/billiards-icon-7.png', './images'), ('images/minus.png', './images'), ('billiardsclub.kv', '.')],
    

    图标路径同步修改:

    icon=['images/billiards-icon-7.ico'],
    
  2. 统一资源加载路径
    打包后程序会运行在临时目录,直接用相对路径无法找到资源。在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')
    
  3. 验证资源打包情况
    打包后打开dist文件夹,检查images目录下是否存在minus.png。如果不存在,说明spec文件的datas配置仍有问题,需再次核对源文件路径是否正确。

  4. 重新打包
    修改spec文件后,执行pyinstaller your_spec_file.spec重新打包,确保新配置生效。

内容的提问来源于stack exchange,提问作者newpy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 12:10:38