Odoo13导入pysftp报bcrypt PyInt_FromLong未定义符号错误
问题背景
在Linux服务器执行pip install pysftp命令安装pysftp库,用于Odoo13自定义模块的功能开发,安装完成后服务运行时触发导入错误。此前已开展多轮排查验证,包括将虚拟环境Python版本从2.7切换至3.6,所有尝试均未解决问题。
运行环境信息
- Python版本:3.6.9
- Pip版本:20.3.4
核心错误提示
ImportError: /usr/lib/python3.6/bcrypt/_bcrypt.so: undefined symbol: PyInt_FromLong
完整错误日志
Traceback (most recent call last): File "/odoo/odoo-server/odoo/modules/registry.py", line 87, in new odoo.modules.load_modules(registry._db, force_demo, status, update_module) File "/odoo/odoo-server/odoo/modules/loading.py", line 424, in load_modules force, status, report, loaded_modules, update_module, models_to_check) File "/odoo/odoo-server/odoo/modules/loading.py", line 315, in load_marked_modules perform_checks=perform_checks, models_to_check=models_to_check File "/odoo/odoo-server/odoo/modules/loading.py", line 182, in load_module_graph load_openerp_module(package.name) File "/odoo/odoo-server/odoo/modules/module.py", line 404, in load_openerp_module __import__('odoo.addons.' + module_name) File "/odoo/custom/addons/hr_zk_attendance/__init__.py", line 22, in <module> from . import models File "/odoo/custom/addons/hr_zk_attendance/models/__init__.py", line 22, in <module> from . import zk_machine File "/odoo/custom/addons/hr_zk_attendance/models/zk_machine.py", line 62, in <module> import pysftp File "/usr/local/lib/python3.6/dist-packages/pysftp/__init__.py", line 12, in <module> import paramiko File "/usr/local/lib/python3.6/dist-packages/paramiko/__init__.py", line 22, in <module> from paramiko.transport import SecurityOptions, Transport File "/usr/local/lib/python3.6/dist-packages/paramiko/transport.py", line 91, in <module> from paramiko.dsskey import DSSKey File "/usr/local/lib/python3.6/dist-packages/paramiko/dsskey.py", line 37, in <module> from paramiko.pkey import PKey File "/usr/local/lib/python3.6/dist-packages/paramiko/pkey.py", line 31, in <module> import bcrypt File "/usr/lib/python3.6/bcrypt/__init__.py", line 25, in <module> from bcrypt import _bcrypt ImportError: /usr/lib/python3.6/bcrypt/_bcrypt.so: undefined symbol: PyInt_FromLong 2022-07-13 13:30:00,117 6671 INFO visiomate_test werkzeug: 139.135.36.87 - - [13/Jul/2022 13:30:00] "GET /favicon.ico HTTP/1.1" 500 - 10 0.003 0.288 2022-07-13 13:30:00,122 6671 ERROR visiomate_test werkzeug: Error on request: Traceback (most recent call last): File "/usr/local/lib/python3.6/dist-packages/werkzeug/serving.py", line 270, in run_wsgi execute(self.server.app) File "/usr/local/lib/python3.6/dist-packages/werkzeug/serving.py", line 258, in execute application_iter = app(environ, start_response) File "/odoo/odoo-server/odoo/service/server.py", line 440, in app return self.app(e, s) File "/odoo/odoo-server/odoo/service/wsgi_server.py", line 142, in application return application_unproxied(environ, start_response) File "/odoo/odoo-server/odoo/service/wsgi_server.py", line 117, in application_unproxied result = odoo.http.root(environ, start_response) File "/odoo/odoo-server/odoo/http.py", line 1288, in __call__ return self.dispatch(environ, start_response) File "/odoo/odoo-server/odoo/http.py", line 1258, in __call__ return self.app(environ, start_wrapped) File "/usr/local/lib/python3.6/dist-packages/werkzeug/wsgi.py", line 766, in __call__ return self.app(environ, start_response) File "/odoo/odoo-server/odoo/http.py", line 1457, in dispatch odoo.registry(db).check_signaling() File "/odoo/odoo-server/odoo/__init__.py", line 104, in registry return modules.registry.Registry(database_name) File "/odoo/odoo-server/odoo/modules/registry.py", line 63, in __new__ return cls.new(db_name) File "/odoo/odoo-server/odoo/modules/registry.py", line 87, in new odoo.modules.load_modules(registry._db, force_demo, status, update_module) File "/odoo/odoo-server/odoo/modules/loading.py", line 424, in load_modules force, status, report, loaded_modules, update_module, models_to_check) File "/odoo/odoo-server/odoo/modules/loading.py", line 315, in load_marked_modules perform_checks=perform_checks, models_to_check=models_to_check File "/odoo/odoo-server/odoo/modules/loading.py", line 182, in load_module_graph load_openerp_module(package.name) File "/odoo/odoo-server/odoo/modules/module.py", line 404, in load_openerp_module __import__('odoo.addons.' + module_name) File "/odoo/custom/addons/hr_zk_attendance/__init__.py", line 22, in <module> from . import models File "/odoo/custom/addons/hr_zk_attendance/models/__init__.py", line 22, in <module> from . import zk_machine File "/odoo/custom/addons/hr_zk_attendance/models/zk_machine.py", line 62, in <module> import pysftp File "/usr/local/lib/python3.6/dist-packages/pysftp/__init__.py", line 12, in <module> import paramiko File "/usr/local/lib/python3.6/dist-packages/paramiko/__init__.py", line 22, in <module> from paramiko.transport import SecurityOptions, Transport File "/usr/local/lib/python3.6/dist-packages/paramiko/transport.py", line 91, in <module> from paramiko.dsskey import DSSKey File "/usr/local/lib/python3.6/dist-packages/paramiko/dsskey.py", line 37, in <module> from paramiko.pkey import PKey File "/usr/local/lib/python3.6/dist-packages/paramiko/pkey.py", line 31, in <module> import bcrypt File "/usr/lib/python3.6/bcrypt/__init__.py", line 25, in <module> from bcrypt import _bcrypt ImportError: /usr/lib/python3.6/bcrypt/_bcrypt.so: undefined symbol: PyInt_FromLong - - -
故障根因
PyInt_FromLong是Python2专属的C层API符号,Python3中该符号已被替换为PyLong_FromLong。报错说明当前Python3环境加载到的bcrypt二进制动态库文件是针对Python2编译的,版本不兼容。从错误路径看,当前加载的是系统全局路径/usr/lib/python3.6/下的bcrypt,属于Python2版本安装残留,或Python3环境的包搜索路径优先级错误,优先加载了非兼容版本的系统包。
解决步骤
- 清理所有环境下的冲突bcrypt安装包
先卸载系统apt源安装的bcrypt包:sudo apt remove -y python-bcrypt python3-bcrypt
再反复执行pip卸载命令,清除全局、用户目录下残留的bcrypt包,直到提示未找到对应安装包为止:pip uninstall -y bcrypt && pip3 uninstall -y bcrypt - 确认Odoo运行环境隔离性
激活Odoo使用的Python3.6虚拟环境,执行which python和which pip,确认返回路径指向虚拟环境目录下的bin/文件夹,而非/usr/bin下的全局Python路径,避免服务启动时混用全局包。 - 安装版本兼容的依赖包
Python3.6最高支持bcrypt 3.2.2版本,过高版本会出现兼容性问题,在激活的虚拟环境内执行以下命令安装适配版本的依赖链:pip install bcrypt==3.2.2 paramiko==2.12.0 pysftp==0.2.9 - 验证修复效果
先在虚拟环境内执行python -c "import pysftp",无任何输出即代表导入链路正常,之后重启Odoo服务即可正常加载自定义模块。
内容的提问来源于stack exchange,提问作者Osama Hassan
相关产品推荐
相关产品推荐

