使用PyInstaller打包Python3.6项目时遇'encodings'模块找不到问题求助
遇到这种核心模块找不到的情况其实挺常见的,尤其是在Python3.6这种稍旧版本搭配PyInstaller时,即便有默认钩子也可能因为路径、缓存或兼容性问题出岔子。给你几个实用的解决思路:
手动强制包含encodings模块
最简单的方法就是在打包命令里直接指定隐藏导入:pyinstaller --hidden-import encodings your_script.py或者更稳妥的是先生成spec文件:
pyi-makespec your_script.py打开生成的
.spec文件,找到hiddenimports参数,把encodings加进去:hiddenimports=['encodings'],再用spec文件重新打包:
pyinstaller your_script.spec确保PyInstaller识别正确的Python3.6路径
有时候PyInstaller会误选系统里的其他Python版本,导致核心模块路径不对。打包时可以明确指定Python解释器的路径:pyinstaller --hidden-import encodings --pythonpath /usr/bin/python3.6 your_script.py把路径换成你实际的Python3.6安装目录就行。
清理PyInstaller缓存文件
旧的build缓存可能会干扰新的打包流程,导致钩子失效。直接删除项目目录下的build、dist文件夹,还有所有__pycache__目录,然后重新执行打包命令,大概率能解决缓存导致的问题。自定义钩子文件兜底
如果默认钩子确实没起作用,你可以自己写一个钩子来强制收集encodings的所有子模块。创建一个名为hook-encodings.py的文件,内容如下:from PyInstaller.utils.hooks import collect_submodules hiddenimports = collect_submodules('encodings')然后把这个文件放到PyInstaller的默认钩子目录(一般在
Lib/site-packages/PyInstaller/hooks下),或者打包时用--additional-hooks-dir参数指定钩子所在的文件夹:pyinstaller --additional-hooks-dir ./hooks your_script.py检查PyInstaller版本兼容性
Python3.6已经停止维护,高版本的PyInstaller(比如4.x及以上)可能不再对它提供完美支持。建议安装适配Python3.6的PyInstaller版本,比如3.6版本:pip install pyinstaller==3.6
这些方法应该能覆盖大部分场景了,如果还是不行,可以检查下你的项目代码里有没有修改sys.path的操作,这类自定义路径的代码很容易打乱PyInstaller的模块收集逻辑。
内容的提问来源于stack exchange,提问作者ANiK3T

