Python导入MySQLdb出错 - Mac 10.6

10

我下载了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$ 

我在stackoverflow上找到了问题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(http://bugs.mysql.com/bug.php?id=59006)影响了Mac 10.6。我尝试了那里列出的解决方法,清理了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个回答

49

1
+1 这是终于解决了我的问题,即使在 Ned Deily 的编辑后似乎工作了但实际上没有。 - cerberos
这个解决方案在macosx上解决了在Eclipse/PyDev/Django/MySQL中遇到的相同问题 - 谢谢! - erikvw

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

但这并不意味着您会在需要更新内容时轻松复现结果。试图将来自不同来源的所有这些碎片粘合成可行的东西实际上并没有任何优点。


我对Mac OS仍然很陌生(现在已经约两个月了)。我本来希望通过一种“烤火试炼”的方式以更多的手动方式完成所有工作。但是,如果我无法让它正常运行,我将采用使用mac端口选项的方式。感谢您的建议。 - yanigisawa
MacPorts的解决方案最终奏效了。它在我的2.6.1安装旁边安装了Python 2.6.6,而/usr/bin/python仍然指向2.6.1,这导致我的Apache CGI脚本出现了上述相同的错误。我不得不添加一个符号链接到2.6.6版本,然后一切都开始正常工作了。谢谢。 - yanigisawa
很高兴听到这个消息。但是要注意:通常情况下,在/usr中覆盖任何东西都是一个非常糟糕的想法,除了/usr/local。那是由苹果作为OS X的一部分进行管理的。我不确定你是否意味着你覆盖了/usr/bin/python。处理多个版本的更好方法是修改shell启动文件,将/opt/local/Library/Frameworks/Python.framework/Versions/2.6/bin放在$PATH的前面,或者在引用Python时使用绝对引用,如`/opt/local/bin/python2.6'。 - Ned Deily
对于这个特定的情况,两种方法都可以,但不知道一般情况应该怎么做。 - Y.H Wong
我已经头痛了几个小时(以前也有过这种情况)。您的帖子解决了我的问题,尤其是install_name_tool的编辑部分。非常感谢您。我简直无法相信在Snow Leopard上安装带有python绑定的mysql有多么困难,真是太疯狂了。 - cerberos
显示剩余2条评论

1

我尝试通过使用静态库编译MySQLdb模块(在site.cfg中设置set static = True)来解决找不到动态库的问题。但是这仍然会生成相同的错误,因为_mysql.o仍在寻求动态库。为了解决这个问题,在setup_posix.py中的if static块中添加了libraries = []


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