Python导入MySQLdb错误 - Mac 10.6

10 投票
3 回答
13160 浏览
提问于 2025-04-16 10:12

我下载了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 个回答

1

我试着解决一个找不到动态库的问题,所以我在 site.cfg 文件里把 MySQLdb 模块设置成用静态库编译(也就是把 set static = True 加上)。可是这样还是出现了同样的错误,因为 _mysql.o 还是在找动态库。为了修复这个问题,我在 setup_posix.py 文件里,如果是静态库的那部分,添加了 libraries = []

49

在我的情况下,我通过添加几个符号链接解决了问题,具体方法可以参考这个链接: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

11

你可以试着运行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上,想要找到一个能正常工作的PythonMySQLdbMySQL库的组合,常常让人感到沮丧:在这里和其他地方都有很多关于这个问题的提问。造成这种情况的原因有很多。我建议你选择一个第三方的完整解决方案,这样他们会构建和安装所有你需要的兼容版本。而且如果你需要升级组件,这个方案应该也能继续工作。多年来,我在使用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

不过,这并不能让你有一种安心的感觉,觉得在需要更新某些东西时可以重现结果。把这些来自不同来源的组件拼凑在一起并让它们工作,并没有什么好处。

撰写回答