Python导入MySQLdb错误 - Mac 10.6
我下载了MySQL 5.5.8并按照安装说明进行了安装,链接在这里:http://dev.mysql.com/downloads/mysql/,同时也安装了MySQLdb这个Python插件,链接是:http://sourceforge.net/projects/mysql-python/。
但是,当我尝试在Python终端中导入MySQLdb时,出现了下面的错误:
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$
我在Stack Overflow上找到了一个问题,编号是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 egg文件,并重新构建,但仍然遇到同样的错误。然后我发现了一个关于MySQL 5.5.8的bug,编号是59006,影响了Mac 10.6,链接在这里:http://bugs.mysql.com/bug.php?id=59006。我尝试了那里的解决方法,清理了egg文件并重新构建,但还是出现这个错误。
请问有没有其他针对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$
3 个回答
我试着解决一个找不到动态库的问题,所以我在 site.cfg 文件里把 MySQLdb 模块设置成用静态库编译(也就是把 set static = True
加上)。可是这样还是出现了同样的错误,因为 _mysql.o 还是在找动态库。为了修复这个问题,我在 setup_posix.py 文件里,如果是静态库的那部分,添加了 libraries = []
。
在我的情况下,我通过添加几个符号链接解决了问题,具体方法可以参考这个链接: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
你可以试着运行otool来查找一下MySQLdb
这个C扩展_mysql.so
到底在找哪些库的路径:
$ 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
去修改一个可执行文件);如果需要设置这个,几乎总是说明某个组件在构建或安装时出了问题。根据我的经验,MySQL项目在OS X的构建和安装方面并不太稳定,你提到的问题也正好印证了这一点。
在OS X 10.6上,想要找到一个能正常工作的Python
、MySQLdb
和MySQL
库的组合,常常让人感到沮丧:在这里和其他地方都有很多关于这个问题的提问。造成这种情况的原因有很多。我建议你选择一个第三方的完整解决方案,这样他们会构建和安装所有你需要的兼容版本。而且如果你需要升级组件,这个方案应该也能继续工作。多年来,我在使用MacPorts
方面取得了不错的成功;其他人则更喜欢Fink
或更新的HomeBrew
。使用MacPorts
时,在从MacPorts的.dmg
文件安装基础文件后,你可以这样构建所有东西:
$ 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
的更新输出,你可以看到库路径名称不匹配。MySQLdb扩展在请求一个相对路径名称(没有开头的/
),而MySQL库则用绝对路径来标识自己,这通常是你想要的。看起来这和MySQL问题59006正好相反,但如果不知道你到现在为止做了哪些步骤,真的很难说你是怎么到这个状态的。你可能可以使用install_name_tool
来修补_mysql.so
,让它使用绝对路径,这样也就不需要设置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
不过,这并不能让你有一种安心的感觉,觉得在需要更新某些东西时可以重现结果。把这些来自不同来源的组件拼凑在一起并让它们工作,并没有什么好处。