我在 MacOS 11.2.2 上使用 python 3.9,并希望使用已安装的 mariadb(“mariadb 10.5.9 已安装且是最新的”)。
但是,python 无法导入模块 mariadb,并且出现此错误:
import mariadb File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/mariadb/__init__.py", line 10, in <module>
from ._mariadb import (
ImportError: dlopen(/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/mariadb/_mariadb.cpython-39-darwin.so, 2): Symbol not found: _mysql_ps_fetch_functions
Referenced from: /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/mariadb/_mariadb.cpython-39-darwin.so
Expected in: flat namespace
in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/mariadb/_mariadb.cpython-39-darwin.so
请帮助纠正这个问题。谢谢。
评论太长了...
_mariadb.cpython-39-darwin.so 应与 libmariadb.3.dylib 链接,后者应提供导出的符号 mysql_ps_fetch_functions。
为了确定问题,我建议如下:
ldd /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/mariadb/_mariadb.cpython-39-darwin.so
应列出 libmariadb.3.dylib
nm libmariadb.3.dylib | grep mysql_ps_fetch_functions
.
如果输出未列出 mysql_ps_fetch_functions api 调用,则您安装的 C/C 版本太旧,或者您安装了多个 C/C 实例。 自制例如提供最新版本3.1.12,要使用该版本请确保setup.py能够找到最新安装的mariadb_config。
作为替代方案,您也可以从源代码构建 C/C 和 C/Python。
我知道安装不是很舒服,但为非 Windows 平台提供通用二进制文件效果不佳,因为依赖项太多(如 TLS 库)。
万一它对其他人有帮助 - 我在 Apple Silicon 机器上遇到了此错误,但按照 Georg Richter 的答案中的步骤进行操作却给了我意想不到的结果。 跑步
otool -l <PATH TO _mariadb.cpython-311-darwin.so>
根本没有给出任何与 libmariadb 库相关的输出。 它只是说:
/Users/python/.virtualenvs/monitoring/lib/python3.11/site-packages/mariadb/_mariadb.cpython-311-darwin.so:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1336.61.1)
事实证明,自制程序已经移动,因此我将 mariadb 软件包安装在系统上的两个位置。 我不是 100% 确定这是问题所在,我没有进行严格的实验,但我认为问题是由于 pip 在配置 mariadb 时选择了 /usr/local/bin/mariadb_config 可执行文件,而不是正确的一、/opt/homebrew/bin/mariadb_config。
我最终按照本页底部的说明(https://github.com/homebrew/install#uninstall-homebrew)从其路径中卸载旧的自制程序:
curl -fsSLO https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh
/bin/bash uninstall.sh --path /usr/local
然后清除 mariadb 包的 pip 缓存。
pip cache remove mariadb
.
最后,在所有这些之后,使用 pip 卸载并重新安装 mariadb 包确实使它工作了。
otool -L ...
结果确实表明它正在选择 mariadb-connector-c 库。