Python的MySQLdb找不到带有Homebrewed MySQL的libmysqlclient.dylib

时间:2015-12-30 20:38:50

标签: python mysql homebrew mysql-python

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

现有答案

许多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中使用正确的符号链接,而无需手动添加另一个符号链接?

4 个答案:

答案 0 :(得分:30)

我也遇到过这个问题。我卸载了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:清空集合,或者在它们之间用逗号表示一个或多个包名称。请注意,某些软件包编译起来很棘手,并且在使用此选项时可能无法安装。

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

答案 1 :(得分:12)

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

答案 2 :(得分:8)

这解决了我的问题:

$ pip uninstall MySQL-python
$ pip install mysqlclient

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

答案 3 :(得分:4)

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

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

  2. 安装

  3. 终端中的
  4. - mdfind libmysqlclient | grep .18.

  5. 复制输出

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