一尘不染

Python导入MySQLdb错误-Mac 10.6

mysql

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

阅读 218

收藏
2020-05-17

共1个答案

一尘不染

您可以尝试运行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

然后是已安装的MySQL库文件的库名称:

$ otool -DX /usr/local/mysql/lib/libmysqlclient.16.dylib

但是您不必诉诸设置DYLD_LIBRARY_PATH(或install_name_tool用于修改可执行文件);设置它的需要几乎总是表明组件构建或安装不正确。以我的经验,MySQL项目在其OS
X构建和安装程序的一致性方面没有很好的跟踪记录,因为您引用的这个问题往往会得到证实。

试图让的工作相结合PythonMySQLdb以及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

MacPorts Python将在上提供/opt/local/bin/python2.6。如果您想运行Django,那么也有一个端口。

编辑:使用来自的更新输出otool,您可以看到库路径名不匹配。MySQLdb扩展名要求一个相对路径名(没有initial
/),而MySQL库使用绝对路径(通常是您想要的)来宣传自己。这似乎与MySQL问题59006相反,但是,在不确切知道到目前为止您已经执行了哪些步骤的情况下,很难说出如何达到此状态。您
可能
可以使用install_name_tool来打补丁_mysql.so以具有绝对路径名,这也将消除对set的任何需要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

但这不应该让您感到温暖和模糊,可以在需要更新某些内容时重现结果。试图将来自不同来源的所有这些片段粘合成有效的东西确实没有任何好处。

2020-05-17