PyInstaller打包Python-Flask应用后出现jinja2.exceptions.TemplateNotFound: color_scale.js问题求助
解决PyInstaller打包后jinja2 TemplateNotFound的问题
结合你描述的情况——已经做了.spec资源配置和branca源码修改,但仍报错——我整理了几个可能的排查和修复方向:
1. 修正.spec文件中datas的目标路径
你当前的datas配置是把模板文件打包到根目录下的templates文件夹,但你修改的element.py代码里,是从bundle_dir/branca/templates加载模板,路径完全不匹配!
把.spec里的datas配置改成:
a = Analysis(['app.py'], datas=[("C:\\...\\Lib\\site-packages\\branca\\templates", "branca/templates")], # 保留其他原有配置... )
这样打包后,模板文件会被放到_MEIPASS/branca/templates目录下,和代码里的路径逻辑完全对应。
2. 验证冻结模式下的模板路径是否正确
在修改后的element.py里加个调试输出,确认实际加载的路径是否存在目标文件:
import sys import os from jinja2 import Environment, PackageLoader, FileSystemLoader if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'): bundle_dir = getattr(sys, '_MEIPASS') data_dir = os.path.abspath(os.path.join(bundle_dir, 'branca', 'templates')) # 打印调试信息,打包后运行exe时会在控制台显示 print(f"[DEBUG] 冻结模式模板路径: {data_dir}") print(f"[DEBUG] color_scale.js是否存在? {os.path.exists(os.path.join(data_dir, 'color_scale.js'))}") ENV = Environment(loader=FileSystemLoader(data_dir)) else: ENV = Environment(loader=PackageLoader('branca', 'templates'))
运行打包后的exe,查看控制台输出。如果显示文件不存在,说明资源打包的路径还是有问题,需要再调整datas配置。
3. 升级PyInstaller版本
你使用的PyInstaller3.6是2020年的旧版本,而Python3.9.6是在2020年底发布的,旧版PyInstaller对Python3.9的冻结资源处理可能存在兼容性问题。建议升级到PyInstaller4.x或5.x的稳定版本:
pip install --upgrade pyinstaller
升级后重新生成.spec文件(或直接用新版本PyInstaller重新打包),新版本对冻结应用的资源收集逻辑更完善,大概率能解决这类路径问题。
4. 排查32位/64位环境差异
既然旧32位打包没问题,当前如果是64位环境,可以做以下检查:
- 确认64位Python环境下,branca包的模板文件确实在
Lib\site-packages\branca\templates路径下; - 尝试切换到32位Python环境重新打包,对比两种环境下的打包结果,排查是否是64位环境特有的路径或资源收集问题。
5. 手动指定单个模板文件
如果批量打包模板文件夹仍有问题,可以尝试单独指定需要的模板文件,确保每个文件都被正确打包:
datas=[ ("C:\\...\\Lib\\site-packages\\branca\\templates\\color_scale.js", "branca/templates"), ("C:\\...\\Lib\\site-packages\\branca\\templates\\legend.js", "branca/templates"), # 列出branca需要的所有模板文件 ]
内容的提问来源于stack exchange,提问作者Cimei
相关产品推荐
相关产品推荐

