2011-06-17 72 views
162

我刚刚在我的mac os 10.6上编译并安装了python 2.7的mysqldb。我创建了进口python mysqldb:Library not loaded:libmysqlclient.18.dylib

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版本在哪里找到它。我在哪里设置?

回答

310

我通过创建符号链接库解决了这个问题的路径可以设置。即

实际库位于

/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的埃尔卡皮坦系统完整性保护(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 
+0

什么是符号链接的命令? – locoboy 2011-10-28 08:13:29

+47

'sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib/usr/lib/libmysqlclient.18.dylib' – hughes 2011-10-31 15:00:51

+0

我已经通过MacPorts安装了'mysql55'并解决了这个错误:'sudo ln -s mysql/libmysqlclient.18.dylib /opt/local/lib/mysql55/libmysqlclient.18。dylib' – philfreo 2012-05-16 20:12:04

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 

就是这样。

+5

在/ usr /本地/ MySQL指向已安装的版本,所以我建议将你的行更改为: export DYLD_LIBRARY_PATH =/usr/local/mysql/lib /:$ DYLD_LIBRARY_PATH – sneak 2013-03-04 00:59:35

20

我发现把它放在你的.profile或.bashrc中(无论你使用哪一种)是最简单的方法,sym链接相比在源文件中保留路径是凌乱的。

还比较了yoshisurfs的答案,大部分时间当mysql被安装时,mysql目录应该被重命名为只是mysql,而不是整个文件名,以便于使用。

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

这似乎是一个非常理智和简单的答案。为我工作得很好 - 谢谢! – 2015-06-23 09:07:48

128

我的首选方法是实际修复库,而不是环境变量,可能会或可能不会实际在范围取决于应用程序是如何运行的播放。这实际上是一个相当简单的过程。

首先,看看错误输出,看看那里有问题的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

难道这不是一个更好的解决方案,所以它用所有的virtualenvs来修复它吗? sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib $ VIRTUAL_ENV/lib/python2.7/site-packages/_mysql.so – 2013-11-26 19:56:37

+1

@BradRuderman我想清楚这一点很重要当你运行你给出的命令时,你只修改一个virtualenv - 你当前的一个。此外,不是每个人都(在他们的意义上)在虚拟世界中运行,所以命令行不会像发布的那样是一般的解决方案。 – GreenAsJade 2014-11-04 10:10:05

+1

重要提示给出的示例是修复全局python/mysql,您需要在每个虚拟环境中修复它。如果你和我一样,你就会在第一部分_mysql位置看到它,这是重要的一步。 – 2015-10-08 15:32:29

35

就我而言,我在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文件的位置。

+1

我必须创建'/ usr/local/lib'目录,但工作起来就像一个魅力! – cloudrave 2013-11-02 18:13:06

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不适合我。

3

对于使用自制软件可能会解决这个问题这些:

$ brew link mysql 
+0

这工作对我来说,它创建了一个这样的链接: /usr/local/lib/libmysqlclient.18.dylib - > /usr/local/Cellar/mysql/5.6.27/lib/libmysqlclient.18.dylib – 2016-12-13 20:52:10

2
当你在EI Capitan的

,会得到错误:ln: /usr/lib/libmysqlclient.18.dylib: Operation not permitted 需要关闭“系统完整性保护”。

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

+0

另一个您可以将'libmysqlclient.18.dylib'文件移动到'/ usr/local/lib',并将路径'PATH =/usr/local/lib:$ PATH'添加到bash_profile中。它为我工作。 – 2015-10-02 11:31:48

1

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

可以使用在MAC OSX埃尔卡皮坦以下命令而不是关闭SIP的:

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

过去有一个选项,在这里可以登录为根,这可以禁用SIP但在最后释放这是现在已经过时了,你可以阅读更多关于它在这里:https://forums.developer.apple.com/thread/4686

问:

有在开发者测试版1时,以root权限运行,这可以禁用SIP协议的NVRAM启动参数命令可用:

nvram boot-args="rootless=0" 

在El Capitan发行版本中,这种禁用SIP的选项也可用吗?或者这是严格的开发人员构建?

回答:

这个nvram boot-args命令将会消失。它不会在El Capitan发布版本中提供,并可能在开发人员Betas结束之前消失。密切关注未来开发者测试版的发布说明。

1

在我的情况,在埃尔卡皮坦(OSX 10.11),我必须做以下的~/.bash_profile

export DYLD_LIBRARY_PATH="/usr/local/mysql/lib:${DYLD_LIBRARY_PATH}" 
export PATH="/usr/local/mysql/lib:${PATH}" 
0

http://dev.mysql.com/downloads/connector/c/和下载MySQL连接/ C。 获取包后,创建一个新目录'mysql',解压Mysql目录下的Mysql Connector文件,然后在mysql下创建另一个空目录'build'。我们将使用'build'构建MySQL Connector/C. CD打造& & cmake的../your-MySQL-Connector-source-dir 使& &使安装 化妆安装后,您将获得在/ usr /本地一个名为mysql的。它包含您需要的所有标题和库,并将这些标题和库复制到相应的位置。

2

我遇到过几个虚拟环境。

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

工作过两次。

+0

也为我工作 – ThoQ 2017-11-05 03:52:45

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`