PyInstaller打包含python-docx的Python单文件exe遇模块缺失问题
解决python-docx项目打包为单文件.exe的模块缺失问题
核心修复方案
针对你遇到的ModuleNotFoundError(不管是找不到docx还是看似怪异的__future__错误),本质都是PyInstaller未完整打包python-docx模块及其依赖。按以下步骤操作:
- 更新PyInstaller到最新版本
旧版本PyInstaller对部分第三方模块的打包支持存在缺陷,先在虚拟环境中执行升级:
pip install --upgrade pyinstaller
- 自动收集依赖打包(推荐)
直接用--collect-all参数让PyInstaller自动处理docx的所有文件和依赖,无需手动配置spec:
pyinstaller --onefile main.py --name "wordy.exe" --collect-all docx --hidden-import lxml
--collect-all docx:确保递归收集docx模块的所有文件(包括子目录中的image、parts等组件)--hidden-import lxml:python-docx依赖lxml库,显式声明避免打包遗漏
- 手动修改spec文件的备用方案
如果自动打包仍有问题,生成spec文件后手动调整:
- 生成基础spec文件:
pyi-makespec --onefile main.py - 打开
main.spec,修改Analysis部分的参数:a = Analysis( ['main.py'], pathex=[], binaries=[], # 直接指定整个docx目录,递归收集所有文件 datas=[(r"C:\Users\myusername\AppData\Local\pypoetry\Cache\virtualenvs\wordy-nOisIA6h-py3.10\Lib\site-packages\docx", "docx")], hiddenimports=["docx", "lxml"], # 添加核心依赖模块 hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], noarchive=False, ) - 执行打包:
pyinstaller main.spec
错误原因说明
- 之前使用
--collect-data docx仅收集了模块的表层数据文件,未包含代码子目录,导致加载docx.image等子模块时失败。 - 所谓的
__future__模块找不到是假错误,本质是docx的子模块文件缺失,导致PyInstaller加载模块时路径异常,误报了内置模块的问题。 - 你之前修改spec时用
docx/*.*仅收集了根目录文件,漏掉了子文件夹内的内容,这是核心问题之一。
内容的提问来源于stack exchange,提问作者woodduck
相关产品推荐
相关产品推荐

