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 installeasy_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 &amp;&amp; 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-pythonpip 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”的主要内容,如果未能解决你的问题,请参考以下文章

MySQLdb 和 Python ImportError

python导入(MySQLdb)和apache python_egg_cache的问题

Ubuntu中的Python-MySQLdb错误

使用 Python 和 MySQLdb 将新用户添加到 Wordpress

Python3.4下安装pip和MySQLdb

MySQL和python-mysql(mysqldb)在重负载下崩溃