如何解决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无关。
修复步骤
- 移除脚本列表里的.ico文件:图标文件不应放在
Analysis的scripts参数中,而是要在EXE部分通过icon参数指定。 - 修正路径转义问题:spec文件里的路径要统一用双反斜杠(
\\)或者原始字符串(r"路径"),避免单反斜杠导致的转义字符解析错误。 - 调整后的完整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
相关产品推荐
相关产品推荐

