Odoo12还原数据库后启动报posonlyargs字段缺失错误解决方法
问题说明
使用pg_dump完成数据库还原后启动Odoo12服务,抛出如下报错:TypeError: required field "posonlyargs" missing from arguments
问题根因
该报错与pg_dump数据库还原操作无直接关联,还原后启动触发报错是因为Odoo启动时会全量加载模块、执行代码语法解析,刚好走到了不兼容的逻辑段。核心诱因是运行Odoo12的Python版本不兼容:
- Odoo12官方适配的Python版本范围为3.5 ~ 3.7
- Python 3.8及以上版本调整了标准库
ast(抽象语法树模块)的结构定义,新增了posonlyargs(仅支持位置传参的参数)必填字段,Odoo12原生的AST处理逻辑未适配高版本Python的字段要求,解析代码时就会抛出该字段缺失的类型错误。
修复方案
可根据实际场景二选一操作:
方案1:切换至适配版本的Python环境(最稳定,推荐)
将运行Odoo12的虚拟环境/系统Python版本切换到3.7.x版本,重新安装所有依赖后启动服务即可彻底解决兼容性问题,操作步骤:
- 安装Python3.7版本
- 基于Python3.7创建Odoo12专用虚拟环境:
python3.7 -m venv odoo12-venv - 激活虚拟环境后,进入Odoo12源码目录执行依赖安装:
pip install -r requirements.txt - 重新启动Odoo12服务即可
方案2:修改Odoo12源码适配高版本Python(无需降级Python时使用)
找到Odoo12源码中处理AST节点的对应文件,补全缺失的posonlyargs字段默认值即可,操作步骤:
- 打开源码路径下的
odoo/tools/ast.py文件 - 找到
_fix_ast函数中处理ast.arguments类型节点的代码段,在字段赋值的同级位置新增一行node.posonlyargs = [],补全高版本Python要求的必填字段
参考修改片段:
def _fix_ast(node): if isinstance(node, ast.arguments): node.args = [] node.vararg = None node.kwarg = None node.defaults = [] node.kw_defaults = [] # 新增以下行适配Python3.8+ node.posonlyargs = [] # 保留原有节点遍历逻辑无需修改 for child in ast.iter_child_nodes(node): _fix_ast(child)
- 保存文件后重新启动Odoo12服务即可
注意:如果后续安装的第三方Odoo模块自带AST处理逻辑,出现同类报错时,按相同逻辑给对应节点补全
posonlyargs=[]的空值赋值即可。
内容的提问来源于stack exchange,提问作者Nandani
相关产品推荐
相关产品推荐

