给 Odoo 装自定义模块、或者重启 odoo 服务时突然蹦出 ModuleNotFoundError: No module named 'PyPDF2',别慌——这几乎不是代码问题,而是 Python 依赖没装到”服务真正用的那个 Python”里。最常见就三个坑:虚拟环境没激活、Debian 新版把包改了名、systemd 启动脚本指向了系统 Python。下面三步补装,覆盖九成场景。
报错长什么样
通常在 odoo-bin 启动或模块安装阶段炸,关键就一行:
File "/opt/odoo/odoo/odoo/tools/pdf.py", line 4, in <module>
from PyPDF2 import PdfFileWriter, PdfFileReader
ModuleNotFoundError: No module named 'PyPDF2'
只要看到 No module named 'PyPDF2',后面全是连锁反应,先把这一行解决掉。
为什么偏偏是 pypdf2
Odoo 早期依赖写死的是 PyPDF2 这个老包,但上游早就重命名为 pypdf(PyPI 上 PyPDF2 已停更)。两个现实坑:
- Debian 12/13(Trixie):系统仓库只有
python3-pypdf,没有python3-pypdf2,apt 直接装不上。 - 用 venv / pyenv 的:你在本机终端
pip install装到了 venv 里,可 systemd 起的 odoo 服务用的是/usr/bin/python3,根本看不到 venv 的依赖。
三步补装(按环境选)
看清楚环境
确认 odoo 是用系统 Python 还是 venv 跑的,看 systemd 的 ExecStart 路径。
装到对的解释器
venv 就先 activate 再 pip;系统是 apt 就装包。装错地方白搭。
重启服务
改完 ExecStart 或装完依赖,systemctl daemon-reload 再 restart。
| 你的环境 | 该执行的命令 |
|---|---|
| 系统 Python(apt 管理) | sudo apt install python3-pypdf2装不上就换 sudo apt install python3-pypdf |
| venv / pyenv | source /path/to/venv/bin/activate && pip install pypdf2 |
| Debian 13 改名 | pip install pypdf,或用 equivs 做一个提供 python3-pypdf2 的过渡包 |
踩坑实录
我在一台用 pyenv 装的 Odoo 15 上栽过跟头:终端里 python -c "import PyPDF2" 明明能跑出版本 1.26.0,可 systemctl start odoo-15 之后服务总是大约一小时就自己退(exit-code 1)。查 journalctl -u odoo-15 -n 50 才看到 traceback 第一行就是 No module named 'PyPDF2'。根因是 systemd 的 [Service] 段 ExecStart 写的是 /usr/bin/python3 /opt/odoo/odoo-bin,用的是系统 Python,而依赖全在 pyenv 的 venv 里。改法是把 ExecStart 换成 venv 里 python 的绝对路径 /home/odoo/.pyenv/versions/odoo-15-env/bin/python,并在同段加 Environment=PATH=... 指向 venv 的 bin,systemctl daemon-reload && systemctl restart odoo-15 之后就再没崩过。
装完还报?三秒自查
- 到底装到哪个 Python 了:
which python和 odoo 服务用的路径对得上吗?对不上就是白装。 - venv 激活了没:服务靠 systemd 起,不会自动 source 你的
~/.bashrc,必须写进 unit 文件。 - requirements 跑全了没:升级后重跑一遍
pip install -r requirements.txt,别只单装一个包。
常见问题
Q:明明 pip 装了 PyPDF2,为什么还报找不到?
A:九成是 venv 没激活,或者服务用的 Python 跟你装包的不是同一个。用 pip show pypdf2 看 Location,再对比 odoo 进程的实际解释器路径。
Q:Debian 13 提示没有 python3-pypdf2 这个包?
A:上游已重命名为 python3-pypdf,直接 apt install python3-pypdf,或用 pip 装 pypdf,Odoo 新版能认。
Q:为什么升级 Odoo 之后突然开始报这个错?
A:新版依赖清单调整了 PDF 库,旧环境缺新依赖。重新执行 pip install -r requirements.txt 一般就解决。
你在 Odoo 部署里还踩过哪些依赖坑?欢迎在 fenij.com 留言聊聊,我整理成下一篇排错笔记。