Python mysqldb: библиотека не загружена: libmysqlclient.18.dylib

172

Я только что скомпилировал и установил mysqldb для Python 2.7 на моем Mac OS 10.6. Я создал простой тестовый файл, который импортирует

import MySQLdb as mysql

Во-первых, эта команда подчеркнута красным, и информация говорит мне «Неразрешенный импорт». Затем я попытался запустить следующий простой код Python

import MySQLdb as mysql

def main():
    conn = mysql.connect( charset="utf8", use_unicode=True, host="localhost",user="root", passwd="",db="" )

if __name__ == '__main__'():
    main()

При его выполнении я получаю следующее сообщение об ошибке

Traceback (most recent call last):
  File "/path/to/project/Python/src/cvdv/TestMySQLdb.py", line 4, in <module>
    import MySQLdb as mysql
  File "build/bdist.macosx-10.6-intel/egg/MySQLdb/__init__.py", line 19, in <module>
    \namespace cvdv
  File "build/bdist.macosx-10.6-intel/egg/_mysql.py", line 7, in <module>
  File "build/bdist.macosx-10.6-intel/egg/_mysql.py", line 6, in __bootstrap__
ImportError: dlopen(/Users/toom/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.6-intel.egg-tmp/_mysql.so, 2): Library not loaded: libmysqlclient.18.dylib
  Referenced from: /Users/toom/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.6-intel.egg-tmp/_mysql.so
  Reason: image not found

Какое может быть решение моей проблемы?

РЕДАКТИРОВАТЬ: На самом деле я обнаружил, что библиотека находится в / usr / local / mysql / lib. Так что мне нужно сказать моей версии затмения pydev, где ее найти. Где я могу установить это?

Тоом
источник

Ответы:

323

Я решил проблему, создав символическую ссылку на библиотеку. Т.е.

Фактическая библиотека находится в

/usr/local/mysql/lib

И тогда я создал символическую ссылку в

/usr/lib

Используя команду:

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

так что у меня есть следующее отображение:

ls -l libmysqlclient.18.dylib 
lrwxr-xr-x  1 root  wheel  44 16 Jul 14:01 libmysqlclient.18.dylib -> /usr/local/mysql/lib/libmysqlclient.18.dylib

Вот и все. После этого все работало нормально.

РЕДАКТИРОВАТЬ:

Обратите внимание, что, поскольку MacOS El Capitan, защита целостности системы (SIP, также известная как «rootless») не позволит вам создавать ссылки в /usr/lib/. Вы можете отключить SIP, следуя этим инструкциям , но /usr/local/lib/вместо этого вы можете создать ссылку :

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib
Тоом
источник
47
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
Хью
Я установил mysql55через MacPorts и для решения этой ошибки сделал:sudo ln -s mysql/libmysqlclient.18.dylib /opt/local/lib/mysql55/libmysqlclient.18.dylib
philfreo
После того, как Маверикс удалил мою старую символическую ссылку, мне пришлось использовать символическую ссылку из немного другого места: sudo ln -s /usr/local/mysql-5.5.29-osx10.6-x86_64/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
Мэтт
2
Вам придется отключить SIP, если вы работаете на El Capitan: forums.developer.apple.com/thread/7935 .
Джошуа Пинтер
После новой установки El Capitan я обнаружил, что вам не нужно отключать SIP для этого совета.
Lonoshea
135

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

Во-первых, посмотрите на вывод ошибок, чтобы увидеть, где находится модуль Python, который нарушает работу:

ImportError: dlopen (/Library/Python/2.7/site-packages/_mysql.so, 2): библиотека не загружена: libmysqlclient.18.dylib Ссылка на: /Library/Python/2.7/site-packages/_mysql.so Причина: Изображение не найдено

Итак, файл-нарушитель - /Library/Python/2.7/site-packages/_mysql.so

Затем выясните, где _mysql.so считает, что должен найти libmysqlclient.18.dylib:

% otool -L /Library/Python/2.7/site-packages/_mysql.so
/Library/Python/2.7/site-packages/_mysql.so:
    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 169.3.0)

Итак, он ищет libmysqlclient.18.dylib без информации о пути, давайте исправим это:

% sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib /Library/Python/2.7/site-packages/_mysql.so

Теперь _mysql.so знает полный путь к библиотеке, и все работает, независимо от переменных среды.

% otool -L /Library/Python/2.7/site-packages/_mysql.so                                                                                           
/Library/Python/2.7/site-packages/_mysql.so:
    /usr/local/mysql/lib/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 169.3.0)
Калеб Шей
источник
4
Разве это не было бы еще лучшим решением, так что оно исправляет его со всеми virtualenvs? sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib $ VIRTUAL_ENV / lib / python2.7 / site-packages / _mysql.so
Брэд Рудерман,
1
@BradRuderman Я думаю, важно понимать, что когда вы запускаете команду, которую вы дали, вы исправляете только один virtualenv - ваш текущий. Кроме того, не каждый (в ущерб себе) работает в virtualenv, так что командная строка не будет таким общим решением, как опубликованная.
GreenAsJade
1
Важное замечание: приведенный пример исправляет глобальный python / mysql, который вам понадобится исправить в каждой из ваших виртуальных сред. Если вы похожи на меня, вы застеклили прямо над той первой частью, где они находятся _mysql.so, это важный шаг.
Бен Рабиду
Это работает для _mysql.so, установленного в VirtualEnvironments, и не требует отключения SIP в El Capitan.
Аарон Д
Спасибо за объяснение @Caleb :) :) (Y)
Сачин Малхотра
59

Я обнаружил, что было другое решение этой проблемы, а не создание символической ссылки.

Вы задаете путь к каталогу, в котором находится libmysqlclient.18.dylib, к переменной среды DYLD_LIBRARY_PATH. Я сделал следующую строку в моем .bash_profile:

export DYLD_LIBRARY_PATH=/usr/local/mysql-5.5.15-osx10.6-x86/lib/:$DYLD_LIBRARY_PATH

Вот и все.

Йоши
источник
7
есть также символическая ссылка в / usr / local / mysql, которая указывает на установленную версию, поэтому я предлагаю изменить вашу строку на: export DYLD_LIBRARY_PATH = / usr / local / mysql / lib /: $ DYLD_LIBRARY_PATH
sneak
37

В моем случае я получал ошибку с Mac OS X 10.9 Mavericks. Я установил MySQL Community Server непосредственно с веб-сайта Oracle / MySQL от DMG.

Все, что мне нужно было сделать - это создать символическую ссылку на файлы lib в каталог / usr / local / lib.

mkdir -p /usr/local/lib   
ln -s /usr/local/mysql/lib/libmysql* /usr/local/lib

Бонус: если вы используете Mac OS X, есть отличный инструмент для поиска таких файлов, как файл libmysqlclient.18.dylib, http://apps.tempel.org/FindAnyFile . Вот так я и нашел местоположение файла dylib.

Ник Вудхэмс
источник
1
Я должен был создать /usr/local/libкаталог, но работал как шарм!
Ник Меррилл
25

Я обнаружил, что помещать это в ваш .profile или .bashrc (в зависимости от того, что вы используете) - это самый простой способ сделать это, ссылки на sym грязные по сравнению с хранением путей в ваших исходных файлах.

Также по сравнению с ответом yoshisurfs, большую часть времени, когда mysql устанавливается, каталог mysql должен быть переименован в mysql, а не в полное имя файла, для простоты использования.

export DYLD_LIBRARY_PATH=/usr/local/mysql/lib:$DYLD_LIBRARY_PATH
Мэтью Харрисон
источник
2
Это похоже на действительно здравый и простой ответ. Хорошо сработало для меня - спасибо!
Дарра Энрайт
4

Я столкнулся с этим с парой виртуальных сред.

pip uninstall MySQL-python
pip install -U MySQL-python

Работал оба раза.

Джон Редфорд
источник
Работал на меня тоже
Tho
3

Для тех, кто использует homebrew, вы можете исправить это с помощью:

$ brew link mysql
keithpjolley
источник
Это работает для меня, он создал ссылку так: /usr/local/lib/libmysqlclient.18.dylib -> /usr/local/Cellar/mysql/5.6.27/lib/libmysqlclient.18.dylib
Джошуа Grigonis
2

В моем случае, в El Capitan (OSX 10.11), я должен сделать следующее в ~/.bash_profile

export DYLD_LIBRARY_PATH="/usr/local/mysql/lib:${DYLD_LIBRARY_PATH}"
export PATH="/usr/local/mysql/lib:${PATH}"
Кришна Сунувар
источник
2

когда вы находитесь в El Capitan, появится сообщение об ошибке: ln: /usr/lib/libmysqlclient.18.dylib: Operation not permitted необходимо закрыть «Защита целостности системы».

сначала перезагрузитесь и удерживайте cmd + R, чтобы войти в режим восстановления, затем запустите терминал и введите команду: csrutil disableтеперь вы можете перезагрузиться и попробовать снова.

yannisxu
источник
Другой способ переместить файл libmysqlclient.18.dylibв /usr/local/libи добавить путь PATH=/usr/local/lib:$PATHк bash_profile. Это работает для меня.
Булочка Suwanparsert
1

В новой установке El Capitan, где по умолчанию включен SIP (без root, доступ к usr / lib /), и вы не можете создать символическую ссылку, если не находитесь в режиме восстановления. Как сказал @yannisxu, вы можете отключить SIP и сделать символическую ссылку на / usr / lib / local, и это будет работать.

Вы можете использовать следующую команду в MAC OSX El Capitan вместо отключения SIP:

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

Раньше был вариант, когда вы можете войти в систему как root, и это может отключить SIP, но в окончательном выпуске, который сейчас устарел, вы можете прочитать об этом здесь: https://forums.developer.apple.com/thread/4686

Вопрос:

В Developer Beta 1 доступна команда nvram boot-args, которая может отключить SIP при запуске с привилегиями root:

nvram boot-args="rootless=0"

Будет ли эта опция отключения SIP также доступна в версии El Capitan? Или это строго для Developer Builds?

Ответ:

Эта команда nvram boot-args исчезнет. Он не будет доступен в релизной версии El Capitan и может исчезнуть до конца Бета-версий для разработчиков. Следите за заметками о выпуске будущих бета-версий для разработчиков.

mrkzq
источник
0

У меня была эта проблема, и мне потребовалось некоторое время, чтобы понять, как это исправить.

Мой случай немного отличается. Мой MySQL сервер имеет версию 5.1.x. И как-то я обновил свой MySQL-python с 1.2.3 до 1.2.5. И я продолжал получать эту проблему с тех пор, как событие, я добавил следующую мягкую ссылку.

libmysqlclient.18.dylib -> /usr/local/mysql/lib/libmysqlclient.18.dylib

Оказывается, что для MySQL 5.1.x нет libmysqlclient.18.dylib, а только libmysqlclient.16.dylib. Вы можете исправить эту проблему, либо понизив MySQL-python до 1.2.3, либо обновив MySQL-сервер до 5.6.x (я не пробовал 5.5.x.)

Я понизил библиотеку до 1.2.3, так как обновление MySQL не вариант для меня.

Джеймс Дж. Йе
источник
0

перейдите на http://dev.mysql.com/downloads/connector/c/ и загрузите MySQL Connector / C. после получения пакета создайте новый каталог «mysql», распакуйте файл коннектора MySQL в каталоге «mysql», затем в разделе «mysql» создайте еще один пустой каталог «build». Мы будем использовать «build» для сборки MySQL Connector / C. cd build && cmake ../your-MySQL-Connector-source-dir make && make install после make install, вы получите каталог с именем mysql в каталоге / usr / local. он содержит все нужные вам заголовки и библиотеки. Перейдите в этот каталог и скопируйте заголовки и библиотеки в соответствующие местоположения.

user6643531
источник
0

можешь попробовать:

sudo install_name_tool -change libmysqlclient.18.dylib /Users/toom/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.6-intel.egg-tmp/_mysql.so`
Сяолин Лео
источник
0

Примечание об ошибке MySQL Connector / C в macOS (моя текущая версия 10.13.2), исправьте mysql_config и переустановите mysqlclient или MySQL-python, здесь подробно

Вуди Хуан
источник