Ошибка импорта MySQLdb из Python - Mac 10.6 - PullRequest
10 голосов
/ 19 января 2011

Я скачал и следовал инструкциям по установке для MySQL 5.5.8 (http://dev.mysql.com/downloads/mysql/) и для плагина MySQLdb Python. (http://sourceforge.net/projects/mysql-python/)

Когда я пытаюсь импортировать MySQLdb в терминал Python,Я получаю следующую ошибку:

Safira:~ yanigisawa$ python --version
Python 2.6.1
Safira:~ yanigisawa$ python -c "import MySQLdb"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "build/bdist.macosx-10.6-universal/egg/MySQLdb/__init__.py", line 19, in <module>
  File "build/bdist.macosx-10.6-universal/egg/_mysql.py", line 7, in <module>
  File "build/bdist.macosx-10.6-universal/egg/_mysql.py", line 6, in __bootstrap__
ImportError: dlopen(/Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so, 2): Library not loaded: libmysqlclient.16.dylib
  Referenced from: /Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so
  Reason: image not found
Safira:~ yanigisawa$ 

Я нашел вопрос 4559699 о переполнении стека и следовал там инструкциям:

Safira:~ yanigisawa$ echo $DYLD_LIBRARY_PATH
/usr/local/mysql/lib
Safira:~ yanigisawa$ ls -l /usr/local/mysql/lib
total 363224
-rwxr-xr-x   1 root  wheel   3787328 Jan 18 19:41 libmysqlclient.16.dylib
-rw-r--r--   1 root  wheel  10035336 Dec  3 13:26 libmysqlclient.a
lrwxr-xr-x   1 root  wheel        23 Jan 14 22:01 libmysqlclient.dylib -> libmysqlclient.16.dylib
lrwxr-xr-x   1 root  wheel        20 Jan 14 22:01 libmysqlclient_r.16.dylib -> libmysqlclient.dylib
lrwxr-xr-x   1 root  wheel        16 Jan 14 22:01 libmysqlclient_r.a -> libmysqlclient.a
lrwxr-xr-x   1 root  wheel        20 Jan 14 22:01 libmysqlclient_r.dylib -> libmysqlclient.dylib
-rw-r--r--   1 root  wheel  88033760 Dec  3 13:22 libmysqld-debug.a
-rw-r--r--   1 root  wheel  84075304 Dec  3 13:26 libmysqld.a
-rw-r--r--   1 root  wheel      8472 Dec  3 13:26 libmysqlservices.a
drwxr-xr-x  13 root  wheel       442 Dec  3 13:53 plugin
Safira:~ yanigisawa$ md5 /usr/local/mysql/lib/libmysqlclient.16.dylib 
MD5 (/usr/local/mysql/lib/libmysqlclient.16.dylib) = b8a78a93183720021b9dbe9ddad57111
Safira:~ yanigisawa$ 

И после очистки всехФайлы python egg и перестройка, я все еще получал ту же ошибку. Затем я обнаружил ошибку 59006 (http://bugs.mysql.com/bug.php?id=59006) в MySQL 5.5.8, затрагивающую Mac 10.6. Я попробовал обходной путь, указанный там, очистил яйца и перестроилЯ все еще получаю эту ошибку.

Есть ли другой способ решения этой проблемы, специфичный для python? Я что-то упускаю?

EDIT : добавление вывода изкоманды otool:

Safira:~ yanigisawa$ otool -L /Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so
/Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so:
    libmysqlclient.16.dylib (compatibility version 16.0.0, current version 16.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)
Safira:~ yanigisawa$ otool -DX /usr/local/mysql/lib/libmysqlclient.16.dylib
/usr/local/mysql/lib/libmysqlclient.16.dylib
Safira:~ yanigisawa$ 

Ответы [ 3 ]

49 голосов
/ 28 мая 2011

В моем случае я решил добавить пару символических ссылок, как в http://ageekstory.blogspot.com/2011/04/installing-massive-coupon-on-mac-os-10.html

следующим образом:

sudo ln -s / usr / local / mysql /lib / libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

sudo ln -s / usr / local / mysql / lib / usr / local / mysql / lib / mysql

11 голосов
/ 19 января 2011

Вы можете попробовать запустить otool, чтобы точно узнать, какие пути к библиотекам ищет расширение MySQLdb C, _mysql.so:

$ otool -L /Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so

, а затем имя установленной библиотеки файла библиотеки MySQL:

$ otool -DX /usr/local/mysql/lib/libmysqlclient.16.dylib

Но вам не нужно прибегать к установке DYLD_LIBRARY_PATH (или использовать install_name_tool для изменения исполняемого файла); необходимость его установки почти всегда является признаком компонента, который был построен или установлен неправильно. По моему опыту, у проекта MySQL не очень хороший послужной список для согласованности в их сборках и установщиках OS X, так как эта проблема, которую вы цитируете, имеет тенденцию подтверждаться.

Попытка получить рабочую комбинацию библиотек Python, MySQLdb и MySQL в OS X 10.6 - очень распространенная причина разочарования: множество вопросов об этом здесь, в SO и в других местах. Есть несколько причин для этого. Мой совет - пойти с полным решением от одного из сторонних дистрибьюторов, который будет создавать и устанавливать совместимые версии всего, что вам нужно. И он должен продолжать работать, если вам нужно обновить компоненты с течением времени. За эти годы у меня был хороший успех с MacPorts; другие предпочитают Fink или новее HomeBrew. С MacPorts, после установки базовых файлов из MacPorts. dmg, вы можете получить все построенное так:

$ sudo port selfupdate  # ensure the port files are up-to-date
$ sudo port install py26-mysql

MacPorts Python будет доступен на /opt/local/bin/python2.6. Если вы хотите запустить Django, для этого также есть порт.

РЕДАКТИРОВАТЬ: с обновленным выводом из otool, вы можете увидеть, что существует несоответствие имен путей библиотеки. Расширение MySQLdb запрашивает относительный путь (без начального /), в то время как библиотека MySQL объявляет себя с абсолютным путем, обычно тем, что вы хотите. Похоже, что это обратная проблема MySQL 59006, но, не зная точно, какие шаги вы выполняли до сих пор, очень сложно сказать, как вы попали в это состояние. Вы можете иметь возможность использовать install_name_tool для исправления _mysql.so, чтобы получить абсолютный путь, который также устранял бы необходимость в установке DYLD_LIBRARY_PATH. Стоит попробовать:

$ cd ~/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp
$ sudo install_name_tool -change libmysqlclient.16.dylib \
                                 /usr/local/mysql/lib/libmysqlclient.16.dylib \
                         _mysql.so

Но это не должно оставить у вас теплое и нечеткое чувство, что вы можете воспроизвести результаты, когда вам нужно что-то обновить. На самом деле нет смысла пытаться склеить все эти кусочки из разных источников во что-то, что работает.

1 голос
/ 05 сентября 2011

Я попытался решить проблему с библиотекой динамических библиотек путем компиляции модуля MySQLdb со статическими библиотеками (set static = True в site.cfg). Но это породило ту же ошибку, поскольку _mysql.o все еще запрашивал динамическую библиотеку. Чтобы исправить это, я добавил libraries = [] в блок if if static в setup_posix.py.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...