Не могу загрузить mysqlclient.18.dylib в python на Mac OS Lion - PullRequest
0 голосов
/ 30 декабря 2011

Я хочу, чтобы 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 и не могу использовать его на этомсистема.

1 Ответ

0 голосов
/ 30 декабря 2011

Скорее всего, вы установили 32-битный режим выполнения Python, поставляемый Apple, по умолчанию, либо с помощью defaults, либо с помощью переменной окружения VERSIONER_PYTHON_PREFER_32_BIT; см. 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
...