Python导入MySQLdb错误 – Mac 10.6

我下载并遵循MySQL 5.5.8( http://dev.mysql.com/downloads/mysql/ )和MySQLdb python插件的安装说明。 ( http://sourceforge.net/projects/mysql-python/ )

当我尝试将MySQLdb导入pythonterminal时,出现以下错误:

Safira:~ yanigisawa$ python --version Python 2.6.1 Safira:~ yanigisawa$ python -c "import MySQLdb" Traceback (most recent call last): File "<string>", line 1, in <module> File "build/bdist.macosx-10.6-universal/egg/MySQLdb/__init__.py", line 19, in <module> File "build/bdist.macosx-10.6-universal/egg/_mysql.py", line 7, in <module> File "build/bdist.macosx-10.6-universal/egg/_mysql.py", line 6, in __bootstrap__ ImportError: dlopen(/Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so, 2): Library not loaded: libmysqlclient.16.dylib Referenced from: /Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so Reason: image not found Safira:~ yanigisawa$ 

我发现堆栈溢出问题4559699 ,并按照说明:

 Safira:~ yanigisawa$ echo $DYLD_LIBRARY_PATH /usr/local/mysql/lib Safira:~ yanigisawa$ ls -l /usr/local/mysql/lib total 363224 -rwxr-xr-x 1 root wheel 3787328 Jan 18 19:41 libmysqlclient.16.dylib -rw-r--r-- 1 root wheel 10035336 Dec 3 13:26 libmysqlclient.a lrwxr-xr-x 1 root wheel 23 Jan 14 22:01 libmysqlclient.dylib -> libmysqlclient.16.dylib lrwxr-xr-x 1 root wheel 20 Jan 14 22:01 libmysqlclient_r.16.dylib -> libmysqlclient.dylib lrwxr-xr-x 1 root wheel 16 Jan 14 22:01 libmysqlclient_r.a -> libmysqlclient.a lrwxr-xr-x 1 root wheel 20 Jan 14 22:01 libmysqlclient_r.dylib -> libmysqlclient.dylib -rw-r--r-- 1 root wheel 88033760 Dec 3 13:22 libmysqld-debug.a -rw-r--r-- 1 root wheel 84075304 Dec 3 13:26 libmysqld.a -rw-r--r-- 1 root wheel 8472 Dec 3 13:26 libmysqlservices.a drwxr-xr-x 13 root wheel 442 Dec 3 13:53 plugin Safira:~ yanigisawa$ md5 /usr/local/mysql/lib/libmysqlclient.16.dylib MD5 (/usr/local/mysql/lib/libmysqlclient.16.dylib) = b8a78a93183720021b9dbe9ddad57111 Safira:~ yanigisawa$ 

在清理完所有的python蛋文件并重build之后,我仍然得到了同样的错误。 然后,我发现在MySQL 5.5.8中影响Mac 10.6的bug 59006( http://bugs.mysql.com/bug.php?id=59006 )。 我尝试了在那里列出的解决办法,清理鸡蛋并重build,而且我仍然遇到这个错误。

是否有针对python的这个问题的另一个解决方法? 我错过了别的吗?

编辑 :从otool命令添加输出:

 Safira:~ yanigisawa$ otool -L /Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so /Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so: libmysqlclient.16.dylib (compatibility version 16.0.0, current version 16.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1) Safira:~ yanigisawa$ otool -DX /usr/local/mysql/lib/libmysqlclient.16.dylib /usr/local/mysql/lib/libmysqlclient.16.dylib Safira:~ yanigisawa$ 

您可以尝试运行otool来查找MySQLdb C扩展名_mysql.so正在查找的库path:

 $ otool -L /Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so 

然后安装MySQL库文件的安装库名称:

 $ otool -DX /usr/local/mysql/lib/libmysqlclient.16.dylib 

但是,您不应该求助于设置DYLD_LIBRARY_PATH (或使用install_name_tool来修改可执行文件); 设置它的需要几乎总是一个构build或安装不正确的组件的标志。 根据我的经验,MySQL项目在其OS X版本和安装程序的一致性方面没有很好的logging,因为您所引用的问题往往得到证实。

试图在OS X 10.6中实现PythonMySQLdbMySQL库的组合是一个非常常见的MySQLdb原因:在这里和其他地方有很多关于它的问题。 这有几个原因。 我的build议是与一个第三方分销商的完整解决scheme,将build立和安装您需要的一切兼容版本。 如果随着时间的推移需要升级组件,它应该继续工作。 多年来我用MacPorts取得了不错的成绩。 其他人更喜欢Fink或更新的HomeBrew 。 使用MacPorts ,从MacPorts安装基本文件后。 dmg ,你可以像这样build立一切:

 $ sudo port selfupdate # ensure the port files are up-to-date $ sudo port install py26-mysql 

MacPorts Python将在/opt/local/bin/python2.6 。 如果你正在运行Django ,那么也有一个端口。

编辑:从otool更新的输出,你可以看到有一个库path名称不匹配。 MySQLdb扩展名是要求相对path名(不是初始/ ),而MySQL库则用绝对path通告自己,通常是你想要的。 这似乎是MySQL问题59006的反面,但是不知道到目前为止你已经完成了什么步骤,很难说你是如​​何进入这个状态的。 您可以使用install_name_tool_mysql.so修补为具有绝对path名,这也将消除设置DYLD_LIBRARY_PATH任何需要。 值得一试:

 $ cd ~/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp $ sudo install_name_tool -change libmysqlclient.16.dylib \ /usr/local/mysql/lib/libmysqlclient.16.dylib \ _mysql.so 

但是,这不应该给你一个温暖和模糊的感觉,你可以在需要更新的时候重现结果。 将所有这些来自不同来源的作品粘合到一起,确实没有美德。

就我而言,我通过添加几个符号链接来解决,如http://ageekstory.blogspot.com/2011/04/installing-massive-coupon-on-mac-os-10.html

如下所示:

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

sudo ln -s / usr / local / mysql / lib / usr / local / mysql / lib / mysql

我尝试通过编译带有静态库的MySQLdb模块(在site.cfg中set static = True )来解决未dynamic库的问题。 但是,这产生了同样的错误,因为_mysql.o仍然要求dynamic库。 为了解决这个问题,我添加了libraries = []到setup_posix.py中的if静态块。