You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 09:54:23