Python mysqldb:未加载库:libmysqlclient.18.dylib

时间:2011-06-17 08:37:41

标签: python mysql-python

我刚刚在我的mac os 10.6上为python 2.7编译并安装了mysqldb。我创建了一个导入

的简单测试文件
import MySQLdb as mysql

首先,这个命令带有红色下划线,信息告诉我“Unresolved import”。然后我尝试运行以下简单的python代码

import MySQLdb as mysql

def main():
    conn = mysql.connect( charset="utf8", use_unicode=True, host="localhost",user="root", passwd="",db="" )

if __name__ == '__main__'():
    main()

执行时,我收到以下错误消息

Traceback (most recent call last):
  File "/path/to/project/Python/src/cvdv/TestMySQLdb.py", line 4, in <module>
    import MySQLdb as mysql
  File "build/bdist.macosx-10.6-intel/egg/MySQLdb/__init__.py", line 19, in <module>
    \namespace cvdv
  File "build/bdist.macosx-10.6-intel/egg/_mysql.py", line 7, in <module>
  File "build/bdist.macosx-10.6-intel/egg/_mysql.py", line 6, in __bootstrap__
ImportError: dlopen(/Users/toom/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.6-intel.egg-tmp/_mysql.so, 2): Library not loaded: libmysqlclient.18.dylib
  Referenced from: /Users/toom/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.6-intel.egg-tmp/_mysql.so
  Reason: image not found

可能解决我的问题的方法是什么?

编辑: 实际上我发现该库位于/ usr / local / mysql / lib中。所以我需要告诉我的pydev eclipse版本在哪里找到它。我在哪里设置这个?

15 个答案:

答案 0 :(得分:320)

我通过创建指向库的符号链接解决了这个问题。即。

实际的图书馆位于

/usr/local/mysql/lib

然后我在

中创建了一个符号链接
/usr/lib

使用命令:

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

以便我有以下映射:

ls -l libmysqlclient.18.dylib 
lrwxr-xr-x  1 root  wheel  44 16 Jul 14:01 libmysqlclient.18.dylib -> /usr/local/mysql/lib/libmysqlclient.18.dylib

就是这样。之后一切正常。

编辑:

请注意,自MacOS El Capitan以来,系统完整性保护(SIP,也称为“无根”)将阻止您在/usr/lib/中创建链接。 您可以按照these instructions停用SIP,但您可以在/usr/local/lib/中创建一个链接:

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib

答案 1 :(得分:132)

我首选的方法是实际修复库,而不是使用环境变量,这些环境变量可能实际上也可能不在实际范围内,具体取决于应用程序的运行方式。这实际上是一个相当简单的过程。

首先,查看错误输出以查看有问题的python模块所在的位置:

  

ImportError:dlopen(/Library/Python/2.7/site-packages/_mysql.so,2):未加载库:libmysqlclient.18.dylib    参考自:/Library/Python/2.7/site-packages/_mysql.so    原因:未找到图像

好的,有问题的文件是/Library/Python/2.7/site-packages/_mysql.so

接下来,找出_mysql.so认为它应该找到libmysqlclient.18.dylib的位置:

% otool -L /Library/Python/2.7/site-packages/_mysql.so
/Library/Python/2.7/site-packages/_mysql.so:
    libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)

所以,它正在寻找没有路径信息的libmysqlclient.18.dylib,让我们解决一下:

% sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib /Library/Python/2.7/site-packages/_mysql.so

现在_mysql.so知道库的完整路径,无论环境变量如何,一切都有效。

% otool -L /Library/Python/2.7/site-packages/_mysql.so                                                                                           
/Library/Python/2.7/site-packages/_mysql.so:
    /usr/local/mysql/lib/libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)

答案 2 :(得分:56)

我发现此问题还有另一种解决方案,而不是创建符号链接。

将libmysqlclient.18.dylib所在目录的路径设置为DYLD_LIBRARY_PATH环境变量。我所做的是在我的.bash_profile中添加以下行:

export DYLD_LIBRARY_PATH=/usr/local/mysql-5.5.15-osx10.6-x86/lib/:$DYLD_LIBRARY_PATH

就是这样。

答案 3 :(得分:37)

就我而言,我在使用Mac OS X 10.9 Mavericks时遇到了错误。我直接从DMG的Oracle / MySQL网站安装了MySQL社区服务器。

我需要做的就是将lib文件符号链接到/ usr / local / lib目录。

mkdir -p /usr/local/lib   
ln -s /usr/local/mysql/lib/libmysql* /usr/local/lib

奖励:如果你也在运行Mac OS X,那么有一个很棒的工具可以找到像libmysqlclient.18.dylib文件http://apps.tempel.org/FindAnyFile这样的文件。这是我最初找到dylib文件的位置的方法。

答案 4 :(得分:21)

我发现把它放在你的.profile或.bashrc(无论你使用哪个)是最简单的方法,与保存源文件中的路径相比,sym链接很麻烦。

与yoshisurfs的答案相比,大多数情况下安装mysql时,mysql目录应该重命名为mysql,而不是整个文件名,以方便使用。

export DYLD_LIBRARY_PATH=/usr/local/mysql/lib:$DYLD_LIBRARY_PATH

答案 5 :(得分:3)

在pydev eclipse插件中,您可能想要为DYLD设置环境变量。可以如

中所示设置路径

Install mysqldb on snow leopard

答案 6 :(得分:3)

对于那些使用自制软件的人,您可以通过以下方式解决此问题:

$ brew link mysql

答案 7 :(得分:3)

我已经遇到过几个虚拟环境。

pip uninstall MySQL-python
pip install -U MySQL-python

两次工作。

答案 8 :(得分:2)

当你在El Capitan时,会收到错误:ln: /usr/lib/libmysqlclient.18.dylib: Operation not permitted 需要关闭“系统完整性保护”。

首先,重新启动并按住cmd + R进入恢复模式,然后启动终端并输入命令:csrutil disable,现在您可以重新启动并重试。

答案 9 :(得分:1)

在新的El Capitan安装中,默认情况下SIP(无根防止访问usr / lib /)处于打开状态,除非您处于恢复模式,否则无法创建符号链接。正如@yannisxu所说,您可以禁用SIP并将符号链接添加到/ usr / lib / local,这将起作用。

您可以在MAC OSX El Capitan上使用以下命令,而不是关闭SIP:

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib

曾经有一个选项,您可以以root身份登录,这可以禁用SIP,但在最终版本中已经过时,您可以在此处阅读更多相关信息:https://forums.developer.apple.com/thread/4686

问题:

在Developer Beta 1中有一个nvram boot-args命令可以在以root权限运行时禁用SIP:

nvram boot-args="rootless=0"

这个禁用SIP的选项是否也可以在El Capitan发布版本中使用?或者这是否严格用于开发人员构建?

答案:

这个nvram boot-args命令将会消失。它不会在El Capitan发行版中提供,并可能在开发者Betas结束之前消失。请关注未来Developer Betas的发行说明。

答案 10 :(得分:1)

在我的案例中,在El Capitan(OSX 10.11)中,我必须在~/.bash_profile

中执行以下操作
export DYLD_LIBRARY_PATH="/usr/local/mysql/lib:${DYLD_LIBRARY_PATH}"
export PATH="/usr/local/mysql/lib:${PATH}"

答案 11 :(得分:0)

我遇到了这个问题,我花了一段时间才弄清楚如何解决这个问题。

我的情况略有不同。我的MySQL服务器是5.1.x版。不知何故,我将MySQL-python从1.2.3升级到1.2.5。从那时起,我一直收到以下软链接。

libmysqlclient.18.dylib -> /usr/local/mysql/lib/libmysqlclient.18.dylib

事实证明,对于MySQL 5.1.x,没有libmysqlclient.18.dylib,但只有libmysqlclient.16.dylib。您可以通过将MySQL-python降级到1.2.3或将MySQL服务器升级到5.6.x来解决此问题(我还没试过5.5.x。)

我将库降级到1.2.3,因为升级MySQL不适合我。

答案 12 :(得分:0)

转到http://dev.mysql.com/downloads/connector/c/并下载MySQL Connector / C. 获取软件包后,创建一个新目录&#39; mysql&#39;,解压缩目录mysql下的Mysql Connector文件,然后在mysql下创建另一个空目录&#39; build&#39;。我们将使用&#39; ;建立&#39;构建MySQL Connector / C. cd build&amp;&amp; cmake ../your-MySQL-Connector-source-dir 制造&amp;&amp; make install 在make install之后,您将在/ usr / local下获得一个名为mysql的目录。它包含你需要的所有头文件和库。转到这个目录,并将头文件和库复制到相应的位置。

答案 13 :(得分:0)

你可以尝试:

sudo install_name_tool -change libmysqlclient.18.dylib /Users/toom/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.6-intel.egg-tmp/_mysql.so`

答案 14 :(得分:0)

请注意关于macOS上MySQL Connector / C的错误(我的当前版本是10.13.2),修复mysql_config并重新安装mysqlclient或MySQL-python,here is the detail