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/lib
到 libmysqlclient.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
的问题:
从官方下载mysql 5.6 link: https://dev.mysql.com/downloads/mysql/
安装它
在终端 - mdfind libmysqlclient | grep .18.
复制输出
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
是它的现代版本,有很多改进和错误修复。
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/lib
到 libmysqlclient.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
的问题:
从官方下载mysql 5.6 link: https://dev.mysql.com/downloads/mysql/
安装它
在终端 -
mdfind libmysqlclient | grep .18.
复制输出
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
是它的现代版本,有很多改进和错误修复。