【发布时间】:2012-01-30 10:42:02
【问题描述】:
我想让 MySQL 在 Mac OS X Lion 中使用 Python 2.7 系统。
我知道有很多与此非常相似的问题,实际上我的症状与mysql-python installation problems (on mac os x lion) 相同。但是,这个答案似乎不适用于我的情况。
我的 Mac 是当前运行 64 位内核的 MacBook Pro:
% uname -a
Darwin Leos-MacBook-Pro.local 11.2.0 Darwin Kernel Version 11.2.0: Tue Aug 9 20:54:00 PDT 2011; root:xnu-1699.24.8~1/RELEASE_X86_64 x86_64
Lion 上的股票 python 是一个胖二进制文件:
% file /usr/bin/python
/usr/bin/python: Mach-O universal binary with 2 architectures
/usr/bin/python (for architecture x86_64): Mach-O 64-bit executable x86_64
/usr/bin/python (for architecture i386): Mach-O executable i386
我使用了迁移助手,所以我的系统上安装了旧的 MySQL。我使用How to remove installation of MySQL on Mac OS X 的说明删除了旧的 MySQL 安装。
MySQL 64 位 5.5.19 是从 MySQL 站点上的 .dmg 安装的。像往常一样,这将客户端库放在/usr/local/mysql/lib 中。客户端库似乎正是我们想要的:
% file /usr/local/mysql/lib/libmysqlclient.18.dylib
/usr/local/mysql/lib/libmysqlclient.18.dylib: Mach-O 64-bit dynamically linked shared library x86_64
但是,该共享库无法加载到 python 中(我使用arch 命令来确保我正在运行 64 位图像,尽管结果是相同的,不管有没有那个):
% arch -x86_64 python
Python 2.7.1 (r271:86832, Jul 31 2011, 19:30:53)
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from ctypes import cdll
>>> cdll.LoadLibrary("/usr/local/mysql/lib/libmysqlclient.18.dylib")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 431, in LoadLibrary
return self._dlltype(name)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 353, in __init__
self._handle = _dlopen(self._name, mode)
OSError: dlopen(/usr/local/mysql/lib/libmysqlclient.18.dylib, 6): no suitable image found. Did find:
/usr/local/mysql/lib//libmysqlclient.18.dylib: mach-o, but wrong architecture
/usr/local/mysql/lib/libmysqlclient.18.dylib: mach-o, but wrong architecture
我可以通过许多其他方式重现这个问题,特别是使用标准import MySQLdb;我正在展示重现错误的 ctypes 方式,因为我试图找出问题是在 mysql-python 中还是在 MySQL 客户端库中。从上面看,似乎是客户端库。但是,我很困惑为什么加载器认为客户端库是错误的架构。
在尝试查看问题是否是某个依赖库时,我检查了 libmysqlclient.18.dylib 中的依赖关系:
% otool -L /usr/local/mysql/lib/libmysqlclient.18.dylib
/usr/local/mysql/lib/libmysqlclient.18.dylib:
libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.1)
当然/usr/lib/libSystemB.dylib 是预期的胖二进制:
% file /usr/lib/libSystem.B.dylib
/usr/lib/libSystem.B.dylib: Mach-O universal binary with 2 architectures
/usr/lib/libSystem.B.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64
/usr/lib/libSystem.B.dylib (for architecture i386): Mach-O dynamically linked shared library i386
所以... Python 是 64 位的,mysqlclient 库是 64 位的,而依赖库都是 64 位的...任何关于加载程序拒绝导入库的原因的猜测都非常受欢迎.
仅用于检查所有内容是否为 64 位的安全带和吊带:
% python -c 'import platform; print platform.platform()'
Darwin-11.2.0-x86_64-i386-64bit
% ls -l /usr/local/mysql
lrwxr-xr-x 1 root wheel 27 Dec 10 16:52 /usr/local/mysql@ -> mysql-5.5.19-osx10.6-x86_64
此时,由于我需要真正完成一些工作,我将尝试切换到pymysql。这主要用于 Django,有一种方便的方法可以在 this thread 底部的文档中交换 pymysql。
附:我了解 macports,不能在这个系统上使用它。
【问题讨论】:
-
platform模块不能可靠地指示使用 OS X 通用二进制文件执行 64 位还是 32 位。请改用sys.maxsize。