Python:MySQLdb 和“未加载库:libmysqlclient.16.dylib”
Posted
技术标签:
【中文标题】Python:MySQLdb 和“未加载库:libmysqlclient.16.dylib”【英文标题】:Python: MySQLdb and "Library not loaded: libmysqlclient.16.dylib" 【发布时间】:2011-06-01 09:01:13 【问题描述】:设置...
尝试设置一个干净的 Mac os X 10.6 安装来开发 python/django,但我不记得在 10.5 上遇到过这个问题。
从mysql-5.5.8-osx10.6-x86_64.dmg
上的安装程序安装 MySQL 后,我跑了
$ sudo pip install MySQL-python
而且似乎进展顺利(输出如下)
Downloading/unpacking MySQL-python
Downloading MySQL-python-1.2.3.tar.gz (70Kb): 70Kb downloaded
Running setup.py egg_info for package MySQL-python
warning: no files found matching 'MANIFEST'
warning: no files found matching 'ChangeLog'
warning: no files found matching 'GPL'
Installing collected packages: MySQL-python
Running setup.py install for MySQL-python
building '_mysql' extension
gcc-4.2 -fno-strict-aliasing -fno-common -dynamic -DNDEBUG -g -fwrapv -Os -Wall -Wstrict-prototypes -DENABLE_DTRACE -pipe -Dversion_info=(1,2,3,'final',0) -D__version__=1.2.3 -I/usr/local/mysql/include -I/System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6 -c _mysql.c -o build/temp.macosx-10.6-universal-2.6/_mysql.o -Os -g -fno-common -fno-strict-aliasing -arch x86_64
In file included from _mysql.c:36:
/usr/local/mysql/include/my_config.h:325:1: warning: "SIZEOF_SIZE_T" redefined
In file included from /System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6/Python.h:9,
from pymemcompat.h:10,
from _mysql.c:29:
/System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6/pymacconfig.h:33:1: warning: this is the location of the previous definition
In file included from _mysql.c:36:
/usr/local/mysql/include/my_config.h:419:1: warning: "HAVE_WCSCOLL" redefined
In file included from /System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6/Python.h:8,
from pymemcompat.h:10,
from _mysql.c:29:
/System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6/pyconfig.h:803:1: warning: this is the location of the previous definition
gcc-4.2 -Wl,-F. -bundle -undefined dynamic_lookup build/temp.macosx-10.6-universal-2.6/_mysql.o -L/usr/local/mysql/lib -lmysqlclient_r -lpthread -o build/lib.macosx-10.6-universal-2.6/_mysql.so -arch x86_64
warning: no files found matching 'MANIFEST'
warning: no files found matching 'ChangeLog'
warning: no files found matching 'GPL'
Successfully installed MySQL-python
Cleaning up...
之后我尝试了:
$ python -c "import MySQLdb"
这让我大吃一惊:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/Library/Python/2.6/site-packages/MySQLdb/__init__.py", line 19, in <module>
import _mysql
ImportError: dlopen(/Library/Python/2.6/site-packages/_mysql.so, 2): Library not loaded: libmysqlclient.16.dylib
Referenced from: /Library/Python/2.6/site-packages/_mysql.so
Reason: image not found
那么我的问题...
我做错了什么?/我还需要做什么?
谷歌搜索(并在此处搜索)会返回很多结果,使用 Ruby 得到此错误消息,但使用 Python 却没有太多。
【问题讨论】:
使用 libmysqlclient.16.dylib 代替 10.5 【参考方案1】:_mysql.so
指的是libmysqlclient.16.dylib
。即作为Python和MySQL客户端库的桥梁的共享库_mysql.so
指的是MySQL客户端库的动态库,该库由于某种原因无法加载。
您需要回答的问题:
您的系统上是否有libmysqlclient.16.dylib
?如果没有,则需要安装
MySQL 客户端软件。
如果是这样,您的DYLD_LIBRARY_PATH
设置中是否包含该库的目录?如果不,
尝试添加它。
如果是这样,您必须确保libmysqlclient.16.dylib
文件没有损坏。我的
复制,安装在/opt/local/lib/mysql5/mysql/libmysqlclient.16.dylib
,由
MacPorts,具有 MD5 签名 c79ee91af08057dfc269ee212915801a
,大小为 1,462,376 字节。你的文案是什么样的?
【讨论】:
非常感谢布赖恩!我的副本位于 /usr/local/mysql-5.5.8-osx10.6-x86_64/lib/libmysqlclient.16.dylib,是 3,787,328 字节,并且有一个 MD5 sig 9007ca637b74fd2b6c91c681cd4f22b0 所以它绝对不同......但我的 DYLD_LIBRARY_PATH 是空的,添加 /usr/local/mysql-5.5.8-osx10.6-x86_64/lib/ 似乎让我再次运行。在此之前 DYLD_LIBRARY_PATH 为空是否有原因? 默认是空的,我相信。我的也是空的,但我实际上已经有一段时间没有尝试在 Python 中加载 mysql 库了。查看dyld
(man dyld
) 的手册页,并查看DYLD_LIBRARY_PATH
的文档。
我在 Snow Leopard 10.6.6 上遇到了类似的问题,w/Xcode4(不支持 PPC),我最终不得不将 DYLD_LIBRARY_PATH 添加到我的 bash 配置文件中:export DYLD_LIBRARY_PATH=/usr/local/mysql/lib:$DYLD_LIBRARY_PATH
。在以前的安装中从来没有这样做过。我讨厌这个包有多旧和笨重。
通过导出设置 DYLD_LIBRARY_PATH 的建议是我的最后一部分。用 > 设置它不起作用。这整个过程非常烦人。
在 Unix Bourne shell-like shells(如bash
)中,shell 变量默认是本地的;也就是说,它们不会放入环境中,而是保留在流程的本地。 export
关键字将变量标记为“导出到环境”。因此,链接器(shell 的子进程)实际上可以看到变量。仅设置 DYLD_LIBRARY_PATH 而不导出它,意味着它仅在该 shell 中是本地的——因此,对于解决这个问题没有任何帮助。【参考方案2】:
运行pip install
或easy_install
后设置DYLD_LIBRARY_PATH
即可:
export DYLD_LIBRARY_PATH=/usr/local/mysql/lib/
假设您的 MySQL 安装在 /usr/local/mysql
下,应该可以完成这项工作。
【讨论】:
这对我也有用。不完全确定它是永久修复,但现在它正在工作,谢谢! 这个修复对我有用,但我每次尝试启动 django 时都必须这样做。有没有可以设置(保存在文件中)使其成为永久设置的地方? @thomallen 如果你使用virtualenv
,你可以在bin/activate
脚本中设置/取消设置它,否则我会推荐~/.bash_profile
。
谢谢。我找到了很多关于为什么存在这个问题的解释,但这是我发现的第一个答案,它可以快速解决我的问题。干杯。
感谢您的帮助,避免了一堆令人头疼的问题。所以再次节省了一天。【参考方案3】:
如果您的 MySQL 客户端比您的 MySQL-python 包更新,它也会出现。就我而言,我的机器上有一个 libmysqlclient_r.18.dylib,但没有 libmysqlclient_r.16.dylib。运行pip search mysql
透露
MySQL-python - Python MySQL INSTALLED 接口:1.2.3 最新:1.2.3c1
并运行 pip install --upgrade MySQL-python
解决了我的问题。
【讨论】:
这解决了与上述 dynlib hack 相同的问题。似乎使用 pip install MySQL-python 安装的默认版本是 1.2.3,而不是最新版本 1.2.3c1。要获取最新版本,请使用: pip install MySQL-python==1.2.3c1 很好,这是我的问题。值得一提的是 --upgrade 实际上似乎并没有正确升级它,而使用 install MySQL-python==[latest version] 确实 我遇到了与@G.Moore 相同的问题 --upgrade 似乎没有捕捉到新的 .dylib 参考。pip uninstall MySQL-python && pip install MySQL-python
似乎也可以。【参考方案4】:
在easy_install之后,我创建了一个解决问题的软链接
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib
【讨论】:
我不知道这是做什么的,但是当所有其他方法都失败时,它解决了我的问题!非常感谢你!! 最佳和最简单的解决方案 这也是唯一对我有用的,其他都试过了。 创建软链接也解决了我的问题。非常感谢! 最新版本的 Mac OS 需要此解决方案,因为它们限制了 OS 将搜索 dynlibs 的目录。【参考方案5】:在最新版本的 MySQL 5.7.9 上,MySQL-python
不支持它,我改用了PyMySQL
库。我还在manage.py
(在 Django 项目中)中添加了这些行来模拟 MySQL-python 的 API:
try:
# load MySQLdb interface emulation
import pymysql
pymysql.install_as_MySQLdb()
except ImportError:
pass
【讨论】:
【参考方案6】:在我的设置中(来自 brew、pyenv 的 mysql 5.7.x),我有一个更新的 lib 文件 libmysqlclient.20.dylib
。有效的是pip uninstall MySQL-python
和pip install MySQL-python
。
【讨论】:
如果有缓存,也可以试试pip --no-cache-dir install MySQL-python
。【参考方案7】:
对于像我这样需要或已经安装了 MySQLdb 和 PyMySQL 的人(在我的情况下,我需要同时安装这两个,因为我使用 PyMySQL 连接到我的本地 MySQL 实例,并使用 MySQLDb 连接到远程/实时实例):
确保您使用的是正确的 URI 方案。访问本地实例:
LOCAL_DATABASE_URI = 'mysql+pymysql://username:password@hostname/dbname'
现场直播:
REMOTE_DATABASE_URI = 'mysql+mysqldb://username:password@hostname/dbname'
做出这种区分解决了我的问题
【讨论】:
以上是关于Python:MySQLdb 和“未加载库:libmysqlclient.16.dylib”的主要内容,如果未能解决你的问题,请参考以下文章
python导入(MySQLdb)和apache python_egg_cache的问题