PyInstaller打包Windows程序报错:No module named 'encodings'求助
问题描述
我在Windows系统中使用PyInstaller执行命令pyinstaller __main__.spec打包Python项目后,运行生成的.exe文件时出现以下报错:
Py_initialize: unable to load the file system codec ModuleNotFoundError: No module named 'encondings'
项目运行时一切正常,Linux系统中打包也没问题,且已经在__main__.spec文件中添加了hiddenimports=['encodings'],但问题仍未解决。我的__main__.spec内容如下:
# -*- mode: python -*- block_cipher = None a = Analysis(['__main__.py'], pathex=['C:\Users\user\PycharmProjects\l_concept'], binaries=[], datas=[], hiddenimports=['encodings'], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher) exclude_binaries=False, name='__main__', debug=False, strip=False, upx=True, console=True ) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, a.binaries, Tree('C:\Users\user\PycharmProjects\l_concept\providers', prefix='providers'), Tree('C:\Users\user\PycharmProjects\l_concept\utils', prefix='utils'), exclude_binaries=False, name='__main__', debug=False, strip=False, upx=True, console=True ) coll = COLLECT(exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=True, name='__main__')
解决方案
结合我自己的踩坑经验,给你几个针对性的解决方向:
修复路径转义问题:Windows路径中的反斜杠
\在Python字符串中会被解析为转义字符(比如\U会被当成Unicode转义),导致PyInstaller无法正确识别路径。你需要把spec里的所有路径改成双反斜杠或者原始字符串:
比如把pathex=['C:\Users\user\PycharmProjects\l_concept']改成pathex=[r'C:\Users\user\PycharmProjects\l_concept'](前面加r表示原始字符串),或者pathex=['C:\\Users\\user\\PycharmProjects\\l_concept']。Tree的路径也要做同样修改:Tree(r'C:\Users\user\PycharmProjects\l_concept\providers', prefix='providers'), Tree(r'C:\Users\user\PycharmProjects\l_concept\utils', prefix='utils')这个是Windows下PyInstaller打包最常见的坑之一,很多模块缺失问题都是路径解析错误导致的。
修复spec文件的语法错误:你的spec里有一行明显的语法错误——在Analysis定义的末尾多了一个多余的右括号,导致后续参数解析混乱:
# 原代码中错误的行: exclude_binaries=False, name='__main__', debug=False, strip=False, upx=True, console=True )这部分参数应该属于后续EXE的配置,需要把这个多余的右括号删除,否则PyInstaller解析spec时会出错,导致打包不完整。
禁用UPX压缩:有时候UPX压缩会破坏Python核心模块的文件结构,导致运行时无法加载encodings。你可以把spec里所有的
upx=True改成upx=False,然后重新打包试试。升级PyInstaller版本:旧版本的PyInstaller在Windows下对核心模块的处理可能存在兼容性bug,执行
pip install --upgrade pyinstaller升级到最新稳定版,再重新打包。手动添加encodings模块到datas:如果上面的方法都没效果,可以尝试手动把Python安装目录下的
encodings文件夹添加到datas中,确保打包时被完整包含:# 替换成你的Python实际安装路径 datas=[(r'C:\Python39\Lib\encodings', 'encodings')]
验证步骤
修改完spec后,先删除之前生成的build和dist文件夹,然后重新执行pyinstaller __main__.spec,打包完成后运行dist目录下的exe文件,检查是否解决问题。
内容的提问来源于stack exchange,提问作者João Costa

