py2exe打包含python-docx的Python程序时模板文件缺失报错求助
解决py2exe打包python-docx程序时丢失模板文件的问题
问题核心
py2exe默认会将Python库文件打包进library.zip,但python-docx依赖的templates/default.docx属于静态资源文件,不会被自动包含到zip中,导致运行exe时找不到该模板文件。
方案一:正确配置setup.py的data_files
- 先找到
python-docx的templates目录路径,执行以下代码获取:
import docx import os print(os.path.join(os.path.dirname(docx.__file__), 'templates'))
- 修改你的
setup.py,将templates目录下的文件复制到dist目录对应路径:
from distutils.core import setup import py2exe import docx import os # 获取docx模板目录的绝对路径 docx_templates_dir = os.path.join(os.path.dirname(docx.__file__), 'templates') # 配置data_files:目标路径为dist/docx/templates,源文件为模板目录下的default.docx data_files = [ ('docx/templates', [os.path.join(docx_templates_dir, 'default.docx')]) ] setup( windows=['你的主程序文件名.py'], # GUI程序用windows,控制台程序替换为console data_files=data_files, options={ 'py2exe': { 'packages': ['docx'], # 包含python-docx依赖的库,避免运行时缺失 'includes': ['lxml.etree', 'lxml._elementpath'] } } )
- 执行打包命令:
python setup.py py2exe,打包完成后dist目录下会生成docx/templates/default.docx。
方案二:修改代码手动指定模板路径
如果data_files配置仍有问题,可直接在代码中指定模板文件的路径:
- 将
python-docx的default.docx复制到你的项目根目录(可从之前找到的templates目录中复制)。 - 修改代码中创建Document的部分:
from docx import Document import os # 获取当前exe所在的目录(打包后自动指向dist目录) current_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接模板文件路径 template_path = os.path.join(current_dir, 'default.docx') # 使用指定模板创建文档 doc = Document(template_path)
- 在setup.py中添加data_files,将模板文件复制到dist根目录:
data_files = [ ('.', ['default.docx']) ]
再执行打包命令即可。
方案三:禁止py2exe将docx打包进zip
让py2exe将docx库以文件夹形式保留在dist目录,而非打包进library.zip:
修改setup.py的options配置:
setup( windows=['你的主程序文件名.py'], data_files=data_files, options={ 'py2exe': { 'packages': ['docx'], 'zipfile': None, # 所有库文件会放到dist/library文件夹下 'includes': ['lxml.etree', 'lxml._elementpath'] } } )
这样整个docx库文件夹(包含templates)会被完整复制到dist目录,程序运行时可直接找到模板文件。
注意事项
- 确保打包时激活了正确的Python虚拟环境(如果使用的话),避免依赖路径错误。
- 打包完成后,必须在dist目录下运行exe文件,不要直接在PyCharm中运行打包后的exe。
- 如果程序还依赖其他静态资源(如数据文件),需在data_files中一并配置。
内容的提问来源于stack exchange,提问作者Carina
相关产品推荐
相关产品推荐

