Я хочу, чтобы MySQL работал с системой Python 2.7 в Mac OS X Lion.
Я знаю, что есть много вопросов, очень похожих на это, и фактически мой симптом идентичен Проблемы с установкой mysql-python (на 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
Я использовал Migration Assistant, поэтому на моей системе была установлена старая версия MySQL.Я использовал инструкции на Как удалить установку MySQL на Mac OS X , чтобы удалить старую установку MySQL.
MySQL 64-bit 5.5.19 был установлен из .dmg на MySQLсайт.Как обычно, это поместило клиентскую библиотеку в /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, для которого есть удобный способ поменять pymysql в документированном конце этой темы .
PS Я понимаю macports и не могу использовать его на этомсистема.