Odoo 10(Python 2.7环境)报ImportError: No module named abc错误
问题根因
报错核心是版本兼容性冲突:collections.abc是Python 3.3才从collections拆分出的独立子模块,Python 2.7环境下不存在这个路径,对应的Mapping等抽象基类直接存放在collections模块根目录。
当前环境安装的python-jose库版本过高,已经完全放弃Python 2.7适配,才会触发导入错误。从错误堆栈可以看到,依赖链路是自定义插件api_nodejs -> keycloak库 -> jose库,最终在jose导入环节失败。
排查步骤
- 执行
python --version确认当前运行环境确实为Python 2.7,排除多Python版本切换错误导致的问题 - 执行
pip show python-jose查看已安装的jose库版本,若版本号高于3.2.0(最后一个官方兼容Python 2.7的正式版本),即可确认是版本不匹配问题 - 执行
pip show python-keycloak确认keycloak库版本,排查是否因为keycloak版本过高,自动拉取了不兼容Python2.7的新版jose依赖
解决方法
- 优先方案(无源码侵入,稳定性高):降级jose到兼容版本
先卸载当前不兼容的jose版本,再安装适配Python2.7的最后一个稳定版,执行命令:
安装完成后重启Odoo服务,验证插件加载是否正常。pip uninstall -y python-jose pip install python-jose==3.2.0 - 备选方案:如果降级jose后出现keycloak库接口不兼容问题,可同步降级keycloak库到适配Python2.7的版本:
该版本默认依赖适配Python2.7的jose组件,无需单独调整jose版本。pip uninstall -y python-keycloak pip install python-keycloak==0.25.0 - 临时应急方案(不推荐长期使用):手动修改jose库导入逻辑
打开报错路径下的/home/mayank/.local/lib/python2.7/site-packages/jose/jwt.py文件,将第3行的from collections.abc import Mapping替换为跨版本兼容写法:
该方法属于手动修改第三方库源码,后续执行pip升级依赖时修改会被覆盖,仅适合临时验证场景使用。try: from collections.abc import Mapping except ImportError: from collections import Mapping
内容的提问来源于stack exchange,提问作者mayank nailwal
相关产品推荐
相关产品推荐

