我想讓MySQL在Mac OS X Lion中使用系統Python 2.7。無法將mysqlclient.18.dylib加載到Mac OS Lion的Python中
我知道這裏有很多非常相似的問題,實際上我的症狀與mysql-python installation problems (on mac os x lion)相同。但是,這個答案似乎並不適用於我的案件。
我的Mac是一個當前的MacBook Pro運行64位內核:
% 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上是一個胖二進制:
% 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
但是,共享庫不能被加載到蟒蛇(我使用的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位-Y:
% 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/[email protected] -> mysql-5.5.19-osx10.6-x86_64
在這一點上,因爲我需要真正獲得一些工作做完,我要去嘗試切換到pymysql。這主要用於Django,爲此,在this thread的底部有一個方便的方法來交換pymysql。
P.S.我理解macports,不能在這個系統上使用它。
「平臺」模塊不能可靠地指示64位和32位執行OS X通用二進制文件。改用'sys.maxsize'。 – 2011-12-30 09:11:58