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

如何解决PyInstaller打包Kivy应用时的CSV编码解码错误?

问题:PyInstaller打包Kivy应用时出现UnicodeDecodeError

有一个已开发完成的Kivy应用,功能运行正常,尝试使用PyInstaller将其打包为文件夹形式的.exe文件,对应的PyInstaller .spec文件如下:

a = Analysis(
    ['D:\\Documents\\PyCharm projects\\PyCharm projects\\DesktopApp\\SaniStore_logo.ico', 'D:\\Documents\\PyCharm projects\\PyCharm projects\\DesktopApp\\main.py'],
    pathex=[],
    binaries=[],
    datas=[
    ("D:\Documents\PyCharm projects\PyCharm projects\DesktopApp\Components_data.csv", "."),],
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    noarchive=False,
    decode=False
)
pyz = PYZ(a.pure)
a.datas += [('Code\sanistore.kv','D:\\Documents\\PyCharm projects\\PyCharm projects\\DesktopApp\\sanistore.kv','DATA')]
exe = EXE(
    pyz,
    a.scripts,
    [],
    exclude_binaries=True,
    name='SaniStore',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    console=True,
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
)
coll = COLLECT(
    exe,
    Tree('D:\\Documents\\PyCharm projects\\PyCharm projects\\DesktopApp\\'),
    a.binaries,
    a.datas,
    *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
    strip=False,
    upx=True,
    upx_exclude=[],
    name='SaniStore',
)

打包时出现UnicodeDecodeError错误,回溯信息如下:

Traceback (most recent call last):
  File "C:\Users\danie\AppData\Local\Programs\Python\Python310\lib\runpy.py", line 196, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "C:\Users\danie\AppData\Local\Programs\Python\Python310\lib\runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "C:\Users\danie\AppData\Local\Programs\Python\Python310\Scripts\pyinstaller.exe\__main__.py", line 7, in <module>
  File "C:\Users\danie\AppData\Local\Programs\Python\Python310\lib\site-packages\PyInstaller\__main__.py", line 205, in _console_script_run
    run()
  File "C:\Users\danie\AppData\Local\Programs\Python\Python310\lib\site-packages\PyInstaller\__main__.py", line 189, in run
    run_build(pyi_config, spec_file, **vars(args))
  File "C:\Users\danie\AppData\Local\Programs\Python\Python310\lib\site-packages\PyInstaller\__main__.py", line 61, in run_build
    PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs)
  File "C:\Users\danie\AppData\Local\Programs\Python\Python310\lib\site-packages\PyInstaller\building\build_main.py", line 1042, in main
    build(specfile, distpath, workpath, clean_build)
  File "C:\Users\danie\AppData\Local\Programs\Python\Python310\lib\site-packages\PyInstaller\building\build_main.py", line 982, in build
    exec(code, spec_namespace)
  File "SaniStore.spec", line 5, in <module>
    a = Analysis(
  File "C:\Users\danie\AppData\Local\Programs\Python\Python310\lib\site-packages\PyInstaller\building\build_main.py", line 468, in __init__
    self.__postinit__()
  File "C:\Users\danie\AppData\Local\Programs\Python\Python310\lib\site-packages\PyInstaller\building\datastruct.py", line 184, in __postinit__
    self.assemble()
  File "C:\Users\danie\AppData\Local\Programs\Python\Python310\lib\site-packages\PyInstaller\building\build_main.py", line 606, in assemble
    priority_scripts.append(self.graph.add_script(script))
  File "C:\Users\danie\AppData\Local\Programs\Python\Python310\lib\site-packages\PyInstaller\depend\analysis.py", line 268, in add_script
    self._top_script_node = super().add_script(pathname)
  File "C:\Users\danie\AppData\Local\Programs\Python\Python310\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 1246, in add_script
    contents = fp.read() + '\n'
  File "C:\Users\danie\AppData\Local\Programs\Python\Python310\lib\codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 in position 14: invalid start byte

尝试过修改CSV文件读取方式(比如用二进制读取后转BytesIO,更换编码为utf-8-sig、latin1等),但均未解决问题。


解决方案

问题根源

从回溯信息可以明确:错误发生在PyInstaller的Analysis阶段,它尝试将**.ico图标文件当作Python脚本读取解析**。因为你把SaniStore_logo.ico放到了Analysis的第一个参数(脚本列表)里,PyInstaller会遍历这个列表里的所有文件,尝试以UTF-8文本格式读取并分析依赖,而.ico是二进制文件,自然会触发解码错误。

你的CSV读取修改完全没命中问题核心——当前错误是打包阶段的,和运行时读取CSV无关。

修复步骤

  1. 移除脚本列表里的.ico文件:图标文件不应放在Analysis的scripts参数中,而是要在EXE部分通过icon参数指定。
  2. 修正路径转义问题:spec文件里的路径要统一用双反斜杠(\\)或者原始字符串(r"路径"),避免单反斜杠导致的转义字符解析错误。
  3. 调整后的完整spec文件:
a = Analysis(
    ['D:\\Documents\\PyCharm projects\\PyCharm projects\\DesktopApp\\main.py'],  # 移除.ico文件
    pathex=[],
    binaries=[],
    datas=[
        # 用原始字符串或双反斜杠修正路径
        (r"D:\Documents\PyCharm projects\PyCharm projects\DesktopApp\Components_data.csv", "."),
        (r"D:\Documents\PyCharm projects\PyCharm projects\DesktopApp\sanistore.kv", "Code"),  # 合并datas配置,避免后续追加
    ],
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    noarchive=False,
    decode=False
)
pyz = PYZ(a.pure)
exe = EXE(
    pyz,
    a.scripts,
    [],
    exclude_binaries=True,
    name='SaniStore',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    console=True,
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
    icon='D:\\Documents\\PyCharm projects\\PyCharm projects\\DesktopApp\\SaniStore_logo.ico'  # 在这里指定图标
)
coll = COLLECT(
    exe,
    Tree(r'D:\Documents\PyCharm projects\PyCharm projects\DesktopApp\\'),
    a.binaries,
    a.datas,
    *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
    strip=False,
    upx=True,
    upx_exclude=[],
    name='SaniStore',
)

额外提示

如果后续运行打包后的exe时出现CSV读取错误,再去调整CSV的编码参数(比如用encoding='latin1'),但当前打包阶段的错误已经通过上述步骤解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:04:52