Python 的 MySQLdb 在 Homebrewed MySQL 中找不到 libmysqlclient.dylib

Posted

技术标签:

【中文标题】Python 的 MySQLdb 在 Homebrewed MySQL 中找不到 libmysqlclient.dylib【英文标题】:Python's MySQLdb can’t find libmysqlclient.dylib with Homebrewed MySQL 【发布时间】:2016-04-04 20:44:29 【问题描述】:

使用 Homebrew 安装 mysql 和 Python

我在 OS X 10.10.5 Yosemite 上使用 Homebrew 安装了 MySQL 和 Python。我的 Python 2.7 位于 python -> ../Cellar/python/2.7.9/bin/python,并带有指向它的符号链接 /usr/local/bin/python

/usr/local/bin 中有一个符号链接:mysql -> ../Cellar/mysql/5.7.9/bin/mysql

错误

在 Python 外壳中:

>>> import MySQLdb
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/MySQLdb/__init__.py", line 19, in <module>
    import _mysql
ImportError: dlopen(/usr/local/lib/python2.7/site-packages/_mysql.so, 2): Library not loaded: /usr/local/lib/libmysqlclient.18.dylib
  Referenced from: /usr/local/lib/python2.7/site-packages/_mysql.so
  Reason: image not found

所以我尝试了:$ sudo unlink /usr/local/lib/libmysqlclient.18.dylib

关注者:DYLD_LIBRARY_PATH=/usr/local/mysql/lib/:$DYLD_LIBRARY_PATH

然后(对理由绝望):$ export DYLD_LIBRARY_PATH=/usr/local/Cellar/mysql/5.7.9/lib

但在这两种情况下import MySQLdb 仍然尝试导入libmysqlclient.18.dylib

然后我尝试了:$ pip install -U MySQL-python 并得到: Requirement already up-to-date: MySQL-python in /usr/local/lib/python2.7/site-packages

现有答案

许多answers to this problem on SO 建议使用版本号手动创建指向库的显式符号链接(在我的情况下为libmysqlclient.20.dylib)。然而,考虑到现有的符号链接,这似乎很粗糙,而且不是面向未来的:

/usr/local/liblibmysqlclient.dylib -&gt; ../Cellar/mysql/5.7.9/lib/libmysqlclient.dylib

/usr/local/Cellar/mysql/5.7.9/lib 中我们发现:libmysqlclient.20.dylib

在同一目录中带有符号链接: libmysqlclient.dylib -&gt; libmysqlclient.20.dylib

如何让 Python 忘记libmysqlclient.18.dylib

那么我怎样才能让 Python 忘记 /usr/local/lib/libmysqlclient.18.dylib 并按照 /usr/local/liblibmysqlclient.dylib 中的正确符号链接,而无需手动添加另一个符号链接?

【问题讨论】:

遵循同样的困惑路径 - 重要的区别是我认为最新的 brew install 提供的 libmysqlclient.20.dylib 不是 18 并且 Aplusplus 建议的重新安装 MySQL 也为我回答了这个问题。 为我pip install mysqlclient 解决了问题 【参考方案1】:

我也遇到过这个问题。我卸载了 MySQL-python,然后安装了它。

pip uninstall MySQL-python
pip install MySQL-python

更新(基于 cmets)

在某些情况下,您可能需要按以下方式执行第二个(安装)步骤:

pip install --no-binary MySQL-python MySQL-python

no-binary 选项可以让 pip 重新构建它并链接到正确的库:

--no-binary &lt;format_control&gt;

不要使用二进制包。可以多次提供,每次都增加现有值。接受 :all: 禁用所有二进制包, :none: 清空集合,或一个或多个包名称之间用逗号分隔。请注意,某些软件包很难编译,并且在使用此选项时可能无法安装。

注意:请注意,MySQL-python 需要提及 twice。如上所述,第一次出现是要应用no-binary 选项的包的名称,第二次指定要安装的包。

【讨论】:

谢谢,这有帮助,但我也不得不使用 pip install --no-binary MySQL-python MySQL-python 来避免使用缓存轮 仅 python 2。尚不支持 Python 3。 :// 我已经尝试卸载并重新安装 mysql-python 并且仍然遇到同样的问题。关于如何调试/解决问题的任何其他想法? 更新本地操作系统后,我在 Ruby + Rails 中遇到了同样的错误。我卸载了 gem (gem uninstall mysql2) 并在我的情况下使用 bundler (bundle install) 重新安装,但你可以只使用 gem install mysql2 使用典型的 pip 安装对我不起作用,但使用 --no-binary 标志,它可以工作! :D【参考方案2】:

这解决了我的问题:

$ pip uninstall MySQL-python
$ pip install mysqlclient

MySQL-python 原来已经很老了(最后一次提交是 7 年前)。 mysqlclient 是它的现代版本,有很多改进和错误修复。

【讨论】:

是的。这就是问题所在!整个互联网都有“MySQL-python”作为要走的路,但提交讲述了真实的故事。 OSX 上的 Mojave 存在/曾经存在问题。使用brew install mysql-connector-c 在预期的位置安装了 libmysqlclient.18.dylib。各种“更新”软件通过 brew 和本机安装获得了 libmysqlclient.21.dylib(和其他)。我选择在系统上安装“18”版本,因为 OSX 上的 MySQL 很容易崩溃(运行 10 年),因此选择可理解、可逆和合乎逻辑的修复。值得一提的是,Python+MySQL 在 OSX 上是动荡的,Python+OSX 在历史上也是如此。甚至(PIPENV 之类的)虚拟环境也不能保护用户/应用免受波动,本地驱动程序/资产也可能失败。【参考方案3】:

您需要使用mysqlclient的开发版:

pip install git+https://github.com/PyMySQL/mysqlclient-python.git@master

在我拥有 Python 3.4 上的最新 PyPI 版本 (1.3.7) 之前,它正在搜索 libmysqlclient.18.dylib(来自 MySQL 5.6),而我只有 libmysqlclient.20.dylib(来自 MySQL 5.7)。

如果你使用 Python 3,MySQL-python 不是一个选项(mysqlclient 是它的新版本)。

【讨论】:

绝对帮助我完成了设置:Mac OS X,brew 安装了 python 和 mysql。 这应该是公认的答案!最大的问题是,为什么在18 个多月之后,开发版还没有发布?!?【参考方案4】:

如果遇到缺少libmysqlclient.18.dylib的问题:

    从官方链接下载mysql 5.6:https://dev.mysql.com/downloads/mysql/

    安装它

    在终端 - mdfind libmysqlclient | grep .18.

    复制输出

    sudo ln -s [the output from previous command] /usr/local/lib/libmysqlclient.18.dylib

【讨论】:

以上是关于Python 的 MySQLdb 在 Homebrewed MySQL 中找不到 libmysqlclient.dylib的主要内容,如果未能解决你的问题,请参考以下文章

python 2.x MysqlDB模块使用

在linux上用新版python安装mysqldb

python使用MySQLdb遇到的事务问题

Django 在Python3.5 下报 没有模块MySQLdb

python之MySQLdb模块

适用于 Python 2.7 (Ubuntu) 的 MySQLdb