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

Що може бути вирішенням моєї проблеми?

EDIT: Насправді я з'ясував, що бібліотека лежить у / usr / local / mysql / lib. Тому мені потрібно сказати моїй версії pydev eclipse, де її знайти. Де я це встановити?

Відповіді:


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, також відомий як "без корів") не дозволить вам створювати посилання в /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
Якщо ви працюєте на El Capitan, вам доведеться відключити SIP: forums.developer.apple.com/thread/7935 .
Джошуа Пінтер

Після нової установки El Capitan, я виявив, що вам не потрібно відключати SIP для цієї поради.
Лоношея

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
Хіба це не було б ще кращим рішенням, тому воно фіксує це усіма віртуолами? sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib $ VIRTUAL_ENV / lib / python2.7 / site-пакети / _mysql.so
Бред Рудерман

1
@BradRuderman Я думаю, важливо бути зрозумілим, що при запуску команди, яку ви дали, ви виправляєте лише один virtualenv - ваш поточний. Крім того, не кожен (на свій шкоду) працює у virtualenv, так що командний рядок не був би таким загальним рішенням, як розміщений.
GreenAsJade

1
Важливо відзначити, що наведений приклад - це фіксація глобального python / mysql, який потрібно буде виправити у кожному з ваших віртуальних середовищ. Якщо ви схожі на мене, ви засклили цю першу частину, де вони знаходяться _mysql.so, це важливий крок.
Бен Рабіду

Це працює для _mysql.so, встановленого всередині VirtualEnvironments, і не вимагає відключення SIP в El Capitan.
Аарон Д

Дякую за пояснення @Caleb :) :) (Y)
Sachin Malhotra

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
підкрадатися

37

У моєму випадку я отримував помилку з Mac OS X 10.9 Mavericks. Я встановив сервер спільноти MySQL безпосередньо з веб-сайту 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 (який би ви не використовували) - це найпростіший спосіб зробити це, символьні посилання брудні, порівняно із збереженням шляхів у вихідних файлах.

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

export DYLD_LIBRARY_PATH=/usr/local/mysql/lib:$DYLD_LIBRARY_PATH

2
Це здається справді здоровою і простою відповіддю. Добре працював для мене - дякую!
Darragh Enright

4

Я зіткнувся з цим за допомогою декількох віртуальних середовищ.

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

Працювали обидва рази.


Працював для мене теж
Тхо


3

Для тих, хто використовує домашню мову, ви можете виправити це за допомогою:

$ brew link mysql

Це працювало для мене, воно створило таке посилання: /usr/local/lib/libmysqlclient.18.dylib -> /usr/local/Cellar/mysql/5.6.27/lib/libmysqlclient.18.dylib
Джошуа

2

У моєму випадку, в Ель-Капітані (OSX 10.11), я повинен робити наступне в ~/.bash_profile

export DYLD_LIBRARY_PATH="/usr/local/mysql/lib:${DYLD_LIBRARY_PATH}"
export PATH="/usr/local/mysql/lib:${PATH}"

2

коли ви перебуваєте в Ель-Капітан, вийде помилка: ln: /usr/lib/libmysqlclient.18.dylib: Operation not permitted потрібно закрити "Захист цілісності системи".

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


Інший спосіб перемістити файл libmysqlclient.18.dylibв /usr/local/libі додати шлях PATH=/usr/local/lib:$PATHдо bash_profile. Це працює для мене.
Bun Suwanparsert

1

У новій установці El Capitan, де SIP (без коріння не дозволяє отримати доступ до 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

Питання:

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

nvram boot-args="rootless=0"

Чи буде цей варіант відключення SIP також доступний у версії випуску El Capitan? Або це суворо для розробників?

Відповідь:

Ця команда nvram boot-args відходить. Він не буде доступний у версії випуску El Capitan і може зникнути до кінця бета-версії Developer. Слідкуйте за нотатками до випуску для майбутніх бета-версій Developer.


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 Connector під каталогом mysql, потім під mysql зробіть інший порожній каталог 'build'. ми будемо використовувати 'build' для побудови MySQL Connector / C. cd build && cmake ../your-MySQL-Connector-source-dir make && make install after make install, ви отримаєте каталог з ім'ям mysql під / usr / local. він містить усі заголовки та вкладені файли, які вам потрібні. Перейдіть у цей каталог, а також скопіюйте їх у відповідні місця.


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`

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.