Python导入MySQLdb错误 - Mac 10.6

时间:2011-01-19 01:09:07

标签: python mysql macos

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

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

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 egg文件并重建之后,我仍然遇到了同样的错误。然后我在MySQL 5.5.8中发现了影响Mac 10.6的bug 59006(http://bugs.mysql.com/bug.php?id=59006)。我尝试了在那里列出的解决方法,清理鸡蛋并重建,我仍然收到此错误。

是否存在针对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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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库的工作组合是一个令人沮丧的常见原因:很多关于它的问题都在SO和别处。这有很多原因。我的建议是使用来自第三方分销商的完整解决方案,该分销商将构建和安装所需的一切兼容版本。如果您需要随着时间的推移升级组件,它应该继续工作。多年来我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

但这不应该让你感到温暖和模糊的感觉,当你需要更新某些东西时,你可以重现结果。尝试将来自不同来源的所有这些作品粘合成有效的东西是没有道理的。

答案 2 :(得分:1)

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