Python的MySQLdb无法找到Homebrewed MySQL中的libmysqlclient.dylib

18

使用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 shell中:

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

现有答案

许多答案在此问题上的Stack Overflow上建议手动创建带有版本号的库的显式符号链接(在我的情况下为 libmysqlclient.20.dylib)。但是,鉴于现有的符号链接,这似乎很原始且不具备未来可操作性:

/usr/local/lib中存在:
libmysqlclient.dylib ->../Cellar/mysql/5.7.9/lib/libmysqlclient.dylib

/usr/local/Cellar/mysql/5.7.9/lib中,我们可以找到:
libmysqlclient.20.dylib

并在相同目录中找到其符号链接: libmysqlclient.dylib -> libmysqlclient.20.dylib

如何使 Python 忘记 libmysqlclient.18.dylib

那么我该如何让 Python 忘记 /usr/local/lib/libmysqlclient.18.dylib 并按照 /usr/local/lib 中的正确符号链接跟随到 libmysqlclient.dylib,而无需手动添加另一个符号链接呢?


3
走了同样困惑的路线——重要的区别是我认为最新的brew安装会提供libmysqlclient.20.dylib而不是18,而重新安装MySQL建议由Aplusplus解决了我的问题。 - PhoebeB
对我来说,pip install mysqlclient 解决了这个问题。 - ezdazuzena
4个回答

32

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

pip uninstall MySQL-python
pip install MySQL-python

更新(基于评论)

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

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

no-binary 选项是为了让 pip 自己编译安装并链接到正确的库:

--no-binary <format_control>

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

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


16
谢谢,那确实有帮助,但我还需要使用 pip install --no-binary MySQL-python MySQL-python 来避免使用缓存的 wheel 包。 - Yeray Diaz
2
仅支持Python 2,暂不支持Python 3。 :/ - Piotr Migdal
3
我尝试卸载并重新安装mysql-python,但仍然遇到了相同的问题。您有没有其他想法来调试/修复这个问题? - Vishal
使用普通的pip安装对我无效,但使用--no-binary标志,则可以工作!:D - Jorge Maroto
哇,我试了这么长时间,@YerayDiazDiaz的答案终于对我起作用了!非常感谢@YerayDiazDiaz!!我们应该更新答案来展示一下。 - N V
显示剩余3条评论

16

您需要使用 mysqlclient 的开发版本:

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

之前我在Python 3.4上安装的PyPI版本为1.3.7,它正在寻找来自MySQL 5.6的libmysqlclient.18.dylib,而我只有来自MySQL 5.7的libmysqlclient.20.dylib

如果你使用Python 3,则MySQL-python不可用(mysqlclient是它的更新版本)。


1
绝对帮助了我进行设置:Mac OS X,安装了brew的python和mysql。 - JayNCoke
这应该是被接受的答案!重要的问题是,为什么在18个月之后,开发版本还没有发布?!? - mkoistinen

9
如果遇到缺少 libmysqlclient.18.dylib 的问题,请按以下步骤操作:
  1. 从官方链接下载 mysql 5.6:https://dev.mysql.com/downloads/mysql/

  2. 安装mysql

  3. 在终端中运行命令 mdfind libmysqlclient | grep .18.

  4. 复制输出内容

  5. sudo ln -s [上一个命令的输出内容] /usr/local/lib/libmysqlclient.18.dylib


8
这解决了我的问题:

这在我的情况下解决了我的问题:

$ pip uninstall MySQL-python
$ pip install mysqlclient

MySQL-python被证明非常老旧(上次提交是7年前)。mysqlclient是它的现代版本,具有许多改进和错误修复。


1
没错,这就是问题所在!整个互联网上都在推荐使用“MySQL-python”,但提交记录才是真正的故事。 - Dave Everitt
1
在OSX上,Mojave存在问题。使用brew install mysql-connector-c安装了libmysqlclient.18.dylib,但实际期望的是这个库文件。各种“更新”的软件通过brew和本地安装方式都有libmysqlclient.21.dylib(等等)。我选择将“18”版本放在系统中,因为在OSX上,MySQL很容易出现问题(已经持续了10年),所以选择可理解、可逆转和合乎逻辑的修复方法。需要注意的是,在OSX上,Python+MySQL非常不稳定,历史上Python+OSX也是如此。即使是(像PIPENV一样的)虚拟环境也无法保护用户/应用程序免受波动影响,本地驱动程序/资产也可能会失败。 - Marc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接