Python 的 MySQLdb 找不到 libmysqlclient.dylib 和 Homebrewed MySQL

Python's MySQLdb can’t find libmysqlclient.dylib with Homebrewed MySQL

MySQL 和 Python 安装了 Homebrew

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

现有答案

许多 answers to this problem on SO 建议手动创建一个带有版本号的库的显式符号链接(在我的例子中 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/liblibmysqlclient.dylib 中的正确符号链接,而无需手动添加另一个符号链接?

我也遇到了这个问题。我卸载了 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>

Do not use binary packages. Can be supplied multiple times, and each time adds to the existing value. Accepts either :all: to disable all binary packages, :none: to empty the set, or one or more package names with commas between them. Note that some packages are tricky to compile and may fail to install when this option is used on them.

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

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

  1. 从官方下载mysql 5.6 link: https://dev.mysql.com/downloads/mysql/

  2. 安装它

  3. 在终端 - mdfind libmysqlclient | grep .18.

  4. 复制输出

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

您需要使用 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 是它的新版本)。

这解决了我的问题:

$ pip uninstall MySQL-python
$ pip install mysqlclient

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