Подтвердить что ты не робот

Python MySQLdb не может найти libmysqlclient.dylib с MySQL с открытым исходным кодом

MySQL и Python установлены с Homebrew

Я установил MySQL и Python с Homebrew на OS X 10.10.5 Yosemite. Мой Python 2.7 находится в python -> ../Cellar/python/2.7.9/bin/python с символической ссылкой на него /usr/local/bin/python.

В /usr/local/bin есть символическая ссылка:
mysql -> ../Cellar/mysql/5.7.9/bin/mysql

Ошибка

В оболочке Python:

>>> import MySQLdb
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/MySQLdb/__init__.py", line 19, in <module>
    import _mysql
ImportError: dlopen(/usr/local/lib/python2.7/site-packages/_mysql.so, 2): Library not loaded: /usr/local/lib/libmysqlclient.18.dylib
  Referenced from: /usr/local/lib/python2.7/site-packages/_mysql.so
  Reason: image not found

Итак, я попробовал:
  $ sudo unlink /usr/local/lib/libmysqlclient.18.dylib

а затем:
DYLD_LIBRARY_PATH=/usr/local/mysql/lib/:$DYLD_LIBRARY_PATH

а затем (отчаяние над разумом):
  $ export DYLD_LIBRARY_PATH=/usr/local/Cellar/mysql/5.7.9/lib

Но в обоих случаях import MySQLdb все еще пытался импортировать libmysqlclient.18.dylib.

Затем я попробовал:
  $ pip install -U MySQL-python и получил:   Requirement already up-to-date: MySQL-python in /usr/local/lib/python2.7/site-packages

Существующие ответы

Многие ответы на SO предлагают вручную сделать явную символическую ссылку на библиотеку с номером версии (в моем случае libmysqlclient.20.dylib). Однако это кажется грубым, а не перспективным, учитывая существующие символические ссылки:

в /usr/local/lib есть libmysqlclient.dylib -> ../Cellar/mysql/5.7.9/lib/libmysqlclient.dylib

и в /usr/local/Cellar/mysql/5.7.9/lib находим:
libmysqlclient.20.dylib

с символической ссылкой в ​​том же каталоге: libmysqlclient.dylib -> libmysqlclient.20.dylib

Как заставить Python забыть libmysqlclient.18.dylib?

Итак, как я могу заставить Python забыть /usr/local/lib/libmysqlclient.18.dylib и следовать правильной символической ссылке в /usr/local/lib до libmysqlclient.dylib, не добавляя вручную еще одну символическую ссылку?

4b9b3361

Ответ 1

Я также столкнулся с этой проблемой. Я удалил MySQL-python и установил его.

pip uninstall MySQL-python
pip install MySQL-python

Обновление (на основе комментариев)

В некоторых случаях вам может потребоваться выполнить второй (установочный) шаг следующим образом:

pip install --no-binary MySQL-python MySQL-python

Параметр no-binary - это то, что pip создает новую информацию и ссылается на нужную библиотеку:

--no-binary <format_control>

Не используйте бинарные пакеты. Может поставляться несколько раз, и каждый раз добавляет к существующему значению. Принимает либо: all: для отключения всех двоичных пакетов: none: для удаления набора или одного или нескольких имен пакетов с запятыми между ними. Обратите внимание, что некоторые пакеты сложны для компиляции и могут не выполняться, когда этот параметр используется для них.

Примечание: Обратите внимание, что MySQL-python нужно указать дважды. Как упоминалось выше, первое вхождение - это имя пакета, для которого применяется опция no-binary, вторая указывает пакет для установки.

Ответ 2

Вам нужно использовать версию dev mysqlclient:

pip install git+https://github.com/PyMySQL/[email protected]

До того, как я получил последнюю версию PyPI (1.3.7) на Python 3.4, и она искала libmysqlclient.18.dylib (из MySQL 5.6), тогда как у меня был только libmysqlclient.20.dylib (из MySQL 5.7).

Если вы используете Python 3, MySQL-python не является опцией (и mysqlclient является его новой версией).

Ответ 3

Если возникла проблема с отсутствием libmysqlclient.18.dylib:

  • загрузить mysql 5.6 из официальной ссылки: https://dev.mysql.com/downloads/mysql/

  • установить его

  • в терминале - mdfind libmysqlclient | grep .18.

  • скопировать выходные данные

  • sudo ln -s [the output from previous command] /usr/local/lib/libmysqlclient.18.dylib

Ответ 4

Это решило мою проблему по моему делу:

$ pip uninstall MySQL-python
$ pip install mysqlclient

MySQL-python оказался очень старым (последнее совершение было 7 лет назад). mysqlclient - это современная версия, с большим количеством исправлений и исправлений.