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

178
我刚刚在我的Mac OS 10.6上编译和安装了Python 2.7的MySQLdb。我创建了一个简单的测试文件,导入了...
import MySQLdb as mysql

首先,这个命令会被标记为红色下划线,并出现“未解决的导入”信息。然后我尝试运行以下简单的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个回答

324
我通过创建到库的符号链接来解决了这个问题。例如,
实际库位于
/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/ 中创建链接。 您可以按照这些说明禁用SIP,但您可以在 /usr/local/lib/ 中创建链接。

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

47
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib翻译:使用管理员权限创建一个软链接,将/usr/local/mysql/lib/libmysqlclient.18.dylib链接到/usr/lib/libmysqlclient.18.dylib - hughes
2
如果您正在El Capitan上运行,则必须禁用SIP:https://forums.developer.apple.com/thread/7935。 - Joshua Pinter
在安装 El Capitan 的新系统后,我发现你不需要禁用 SIP 来使用这个提示。 - Lonoshea
是的,我也只是按照这里提到的步骤进行操作,而没有禁用SIP,它可以正常工作。当然,我仍然会收到“从导入中未定义的变量:connect”错误提示,但实际上代码可以正常工作。因此,所有人可能需要做的就是禁用错误,如此处所述:http://stackoverflow.com/a/31399986/1469954 - SexyBeast
我从Mavericks升级到El Capitan,由于SIP的原因无法创建符号链接。然而,Caleb Shay的答案使用install_name_tool来更改libmysqlclient.18.dylib的路径非常有效,如果在虚拟环境中甚至不需要sudo权限。 - Aaron D
显示剩余4条评论

139

我的首选方法是实际修复库,而不是玩弄环境变量,这些环境变量可能或可能不在作用域内,这取决于应用程序的运行方式。这实际上是一个非常简单的过程。

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

ImportError: dlopen(/Library/Python/2.7/site-packages/_mysql.so, 2): Library not loaded: libmysqlclient.18.dylib Referenced from: /Library/Python/2.7/site-packages/_mysql.so Reason: image not found

好的,有问题的文件是 /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)

4
这是否是一个更好的解决方案,以便它适用于所有的虚拟环境?使用以下命令:sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib $VIRTUAL_ENV/lib/python2.7/site-packages/_mysql.so - Brad Ruderman
1
@BradRuderman 我想要明确的是,当你运行你所给出的命令时,你只会修复一个虚拟环境 - 你当前的虚拟环境。此外,并不是每个人都在虚拟环境中运行(这对他们来说是一种损失),因此那个命令行并不像发布的那个解决方案那样通用。 - GreenAsJade
1
重要提示:给出的示例是修复全局的Python/MySQL,您需要在每个虚拟环境中进行修复。如果您像我一样,可能会直接忽略第一部分,即它们所在的位置_mysql.so,这是一个重要的步骤。 - Ben Rabidou
这适用于安装在VirtualEnvironments中的_mysql.so,并且不需要在El Capitan中禁用SIP。 - Aaron D
从dmg安装MySQL,从brew安装mysql-connector-c,然后进行这个更改,这是在High Sierra上让MySQLdb工作的最终解决方法,经历了两天的痛苦。 - Neil

60

我发现除了创建符号链接之外,还有另一种解决这个问题的方法。

你可以将包含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

就是这样。


7
在 /usr/local/mysql 下还有一个符号链接指向已安装的版本,因此我建议将你的命令修改为:export DYLD_LIBRARY_PATH=/usr/local/mysql/lib/:$DYLD_LIBRARY_PATH - sneak

37

在我的情况下,我在 Mac OS X 10.9 Mavericks 上遇到了这个错误。我直接从 Oracle/MySQL 网站上下载 DMG 安装了 MySQL Community Server。

我只需要将 lib 文件 symlink(符号链接)到 /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文件位置的方法。


1
我不得不创建/usr/local/lib目录,但是一切都很顺利! - Nick Merrill

26

我发现将此代码放在您的.profile或.bashrc文件中(根据您使用哪个文件)是最简单的方法,与保留路径在源文件中相比,符号链接会更加混乱。

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

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

2
这似乎是一个非常明智和简单的答案。对我很有效 - 谢谢! - Darragh Enright

5

我在一些虚拟环境中遇到了这个问题。

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

两次都有效。


我也试过了,有效。 - Tho

3

3

对于使用homebrew的用户,您可以通过以下方式解决此问题:

$ brew link mysql

这对我有用,它创建了一个链接,如下所示: /usr/local/lib/libmysqlclient.18.dylib -> /usr/local/Cellar/mysql/5.6.27/lib/libmysqlclient.18.dylib - Joshua Grigonis

2

当你在使用El Capitan时,可能会遇到错误:ln: /usr/lib/libmysqlclient.18.dylib: Operation not permitted需要关闭"系统完整性保护"。

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


1
еҸҰдёҖз§Қж–№жі•жҳҜе°Ҷж–Ү件libmysqlclient.18.dylib移еҠЁеҲ°/usr/local/lib并е°Ҷи·Ҝеҫ„PATH=/usr/local/lib:$PATHж·»еҠ еҲ°bash_profileдёӯгҖӮиҝҷеҜ№жҲ‘жңүж•ҲгҖӮ - Bun Suwanparsert

2

在我的情况下,在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}"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接