Python导入MySQLdb错误 - Mac 10.6

yan*_*awa 10 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$ 
Run Code Online (Sandbox Code Playgroud)

我发现有关堆栈溢出的问题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$ 
Run Code Online (Sandbox Code Playgroud)

清理完所有的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$ 
Run Code Online (Sandbox Code Playgroud)

小智 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


Ned*_*ily 11

您可以尝试运行otool以确切地找出MySQLdbC扩展_mysql.so正在寻找的库路径:

$ otool -L /Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so
Run Code Online (Sandbox Code Playgroud)

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

$ otool -DX /usr/local/mysql/lib/libmysqlclient.16.dylib
Run Code Online (Sandbox Code Playgroud)

但是你不应该诉诸于设置DYLD_LIBRARY_PATH(或使用install_name_tool修改可执行文件); 设置它的需要几乎总是一个构建或安装不正确的组件的标志.根据我的经验,MySQL项目在OS X构建和安装程序中的一致性没有很好的跟踪记录,因为您引用的问题往往得到确认.

试图让的工作相结合Python,MySQLdb以及MySQL在OS X 10.6库是无奈的一个非常常见的原因:很多在这里SO和其他地方关于它的问题.这有很多原因.我的建议是使用来自第三方分销商的完整解决方案,该分销商将构建和安装所需的一切兼容版本.如果您需要随着时间的推移升级组件,它应该继续工作.多年来我取得了很好的成绩MacPorts; 其他人更喜欢Fink或更新HomeBrew.使用MacPorts后,从MacPorts安装基本文件.dmg,你可以像这样建造所有东西:

$ sudo port selfupdate  # ensure the port files are up-to-date
$ sudo port install py26-mysql
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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