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/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
中的正确符号链接,而无需手动添加另一个符号链接?
【问题讨论】:
遵循同样的困惑路径 - 重要的区别是我认为最新的 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 <format_control>
不要使用二进制包。可以多次提供,每次都增加现有值。接受 :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的主要内容,如果未能解决你的问题,请参考以下文章