无法导入模块 mariadb

问题描述 投票:0回答:2

我在 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

请帮助纠正这个问题。谢谢。

python python-3.x macos mariadb
2个回答
2
投票

评论太长了...

_mariadb.cpython-39-darwin.so 应与 libmariadb.3.dylib 链接,后者应提供导出的符号 mysql_ps_fetch_functions。

为了确定问题,我建议如下:

  1. 检查 mariadb.cpython-39-darwin.so 是否已链接到 Connector/C:

ldd /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/mariadb/_mariadb.cpython-39-darwin.so
应列出 libmariadb.3.dylib

  1. 确定 libmariadb.3.dylib 的位置并检查
  2. 的输出

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 库)。


0
投票

万一它对其他人有帮助 - 我在 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 库。

© www.soinside.com 2019 - 2024. All rights reserved.