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
, не добавляя вручную еще одну символическую ссылку?
Ответы
Ответ 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
- это современная версия, с большим количеством исправлений и исправлений.