Odoo模块中PIL加载字体报错OSError: cannot open resource
Odoo中PIL加载字体文件失败的解决方案
核心问题原因
Odoo运行时的工作目录并非模块所在目录,手动指定的相对/绝对路径会因部署环境(如Docker)的路径映射、权限问题失效,导致PIL无法找到字体资源。
1. 使用Odoo内置方法获取可靠路径
直接用odoo.modules.get_module_resource方法获取字体文件的绝对路径,该方法会自动适配Odoo的模块安装路径,无需手动拼接路径:
from odoo.modules import get_module_resource from PIL import ImageFont # 参数依次为:模块名、模块内子目录、文件名 FONTPATH = get_module_resource('modulename', 'static/font', 'Inter-VariableFont_slnt,wght.ttf') h1 = ImageFont.truetype(FONTPATH, h1_height)
2. 检查Docker容器内的文件状态
- 确认挂载路径:进入容器执行
ls /mnt/extra-addons/modulename/static/font(根据你的实际挂载路径调整),验证字体文件是否存在。 - 修复文件权限:确保Odoo进程(通常为
odoo用户)拥有读取权限,执行:chmod 644 /mnt/extra-addons/modulename/static/font/Inter-VariableFont_slnt,wght.ttf chmod 755 /mnt/extra-addons/modulename/static/font
3. 验证字体文件完整性
若上述步骤无效,检查字体文件是否损坏:
- 在容器内安装
fontconfig工具:apt install fontconfig - 执行
fc-list | grep Inter,查看系统是否能识别该字体 - 直接在容器内测试PIL加载:
from PIL import ImageFont # 替换为容器内的实际绝对路径 font = ImageFont.truetype('/mnt/extra-addons/modulename/static/font/Inter-VariableFont_slnt,wght.ttf', 24)
4. 避免使用波浪线路径
Docker容器内的~指向odoo用户的家目录,而非本地开发机路径,绝对路径需使用容器内的实际路径(如/mnt/extra-addons/...)。
内容的提问来源于stack exchange,提问作者unnamed-dev
相关产品推荐
相关产品推荐

