2011-12-30 41 views
0

我想讓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,不能在這個系統上使用它。

+0

「平臺」模塊不能可靠地指示64位和32位執行OS X通用二進制文件。改用'sys.maxsize'。 – 2011-12-30 09:11:58

回答

0

通過使用defaults或設置VERSIONER_PYTHON_PREFER_32_BIT環境變量,您可能已將Apple提供的Python的默認執行模式設置爲32位;詳情請參閱man python。在OS X 10.6和10中。7 /usr/bin/python是一個Apple提供的封裝程序,它確定要運行哪個Python並以哪種模式運行。使用arch執行/usr/bin/python不會影響解釋器。例如:

$ unset VERSIONER_PYTHON_PREFER_32_BIT 
$ arch -x86_64 /usr/bin/python -c "import sys;print(sys.maxsize)" 
9223372036854775807 
$ export VERSIONER_PYTHON_PREFER_32_BIT=yes 
$ arch -x86_64 /usr/bin/python -c "import sys;print(sys.maxsize)" 
2147483647 
# 
# But avoiding the wrapper program .... 
# 
$ arch -x86_64 /usr/bin/python2.7 -c "import sys;print(sys.maxsize)" 
9223372036854775807 
$ arch -i386 /usr/bin/python2.7 -c "import sys;print(sys.maxsize)" 
2147483647 
+0

謝謝Ned,確實是這個問題(MySQLdb仍然無法找到這個庫,但這是一個不同的問題,這在其他地方有很好的記錄)。我確實爲32位Python設置了默認設置,如果我沒有記錯,首先默認設置的原因是這個舞蹈的最後一輪,當我的舊MySQL是32位的,因此拖動了所有的東西。 – user839989 2011-12-30 09:33:07

+0

很高興有幫助。您可以通過將答案標記爲已接受來獲得幫助。 – 2011-12-30 09:42:27

相關問題