Python mysqldb: Biblioteka nie została załadowana: libmysqlclient.18.dylib

172

Właśnie skompilowałem i zainstalowałem mysqldb dla Pythona 2.7 na moim Mac OS 10.6. Stworzyłem prosty plik testowy, który importuje

import MySQLdb as mysql

Po pierwsze, to polecenie jest podkreślone na czerwono, a informacja mówi mi „Nierozwiązany import”. Następnie próbowałem uruchomić następujący prosty kod w Pythonie

import MySQLdb as mysql

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

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

Podczas wykonywania go otrzymuję następujący komunikat o błędzie

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

Jakie może być rozwiązanie mojego problemu?

EDYCJA: Właściwie dowiedziałem się, że biblioteka znajduje się w / usr / local / mysql / lib. Muszę więc powiedzieć mojej wersji zaćmienia pydev, gdzie ją znaleźć. Gdzie mam to ustawić?

toom
źródło

Odpowiedzi:

323

Rozwiązałem problem, tworząc symboliczne łącze do biblioteki. To znaczy

Właściwa biblioteka znajduje się w

/usr/local/mysql/lib

A potem utworzyłem dowiązanie symboliczne w

/usr/lib

Za pomocą polecenia:

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

tak, że mam następujące mapowanie:

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

To było to. Potem wszystko działało dobrze.

EDYTOWAĆ:

Zwróć uwagę, że od MacOS El Capitan ochrona integralności systemu (SIP, znana również jako „rootless”) uniemożliwi tworzenie linków w /usr/lib/. Możesz wyłączyć SIP, postępując zgodnie z tymi instrukcjami , ale /usr/local/lib/zamiast tego możesz utworzyć łącze :

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib
toom
źródło
47
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
hughes
Zainstalowałem mysql55przez MacPorts i aby rozwiązać ten błąd:sudo ln -s mysql/libmysqlclient.18.dylib /opt/local/lib/mysql55/libmysqlclient.18.dylib
philfreo
Po usunięciu przez Mavericks mojego starego linku symbolicznego musiałem utworzyć łącze z nieco innego miejsca: sudo ln -s /usr/local/mysql-5.5.29-osx10.6-x86_64/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
Matt
2
Będziesz musiał wyłączyć SIP, jeśli używasz El Capitan: forums.developer.apple.com/thread/7935 .
Joshua Pinter,
Po nowej instalacji El Capitan odkryłem, że nie musisz wyłączać SIP dla tej wskazówki.
Lonoshea,
135

Moją preferowaną metodą jest naprawienie biblioteki, a nie granie ze zmiennymi środowiskowymi, które mogą, ale nie muszą, znajdować się w zakresie, w zależności od sposobu uruchomienia aplikacji. W rzeczywistości jest to dość prosty proces.

Najpierw spójrz na wyjście błędu, aby zobaczyć, gdzie znajduje się problematyczny moduł Pythona:

ImportError: dlopen (/Library/Python/2.7/site-packages/_mysql.so, 2): Biblioteka nie została załadowana: libmysqlclient.18.dylib Źródło: /Library/Python/2.7/site-packages/_mysql.so Powód: nie znaleziono obrazu

OK, więc naruszający plik to /Library/Python/2.7/site-packages/_mysql.so

Następnie dowiedz się, gdzie według _mysql.so powinien znaleźć 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)

Tak więc szuka libmysqlclient.18.dylib bez informacji o ścieżce, naprawmy to:

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

Teraz _mysql.so zna pełną ścieżkę do biblioteki i wszystko działa, niezależnie od zmiennych środowiskowych.

% 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)
Caleb Shay
źródło
4
Czy nie byłoby to jeszcze lepsze rozwiązanie, więc naprawia to ze wszystkimi virtualenvami? sudo nazwa_instalacji_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib $ VIRTUAL_ENV / lib / python2.7 / site-packages / _mysql.so
Brad Ruderman
1
@BradRuderman Myślę, że ważne jest, aby było jasne, że uruchamiając polecenie, które podałeś, naprawiasz tylko jedno virtualenv - bieżące. Co więcej, nie wszyscy (na swoją szkodę) działają w virtualenv, więc wiersz poleceń nie byłby tak ogólnym rozwiązaniem, jak to, które zostało opublikowane.
GreenAsJade
1
Ważna uwaga, podany przykład to naprawianie globalnego python / mysql, musisz to naprawić w każdym ze swoich wirtualnych środowisk. Jeśli jesteś podobny do mnie, przeszklone tuż nad pierwszą częścią, w której znajdują się _mysql. więc to ważny krok.
Ben Rabidou
Działa to dla _mysql.so zainstalowanego w środowiskach wirtualnych i nie wymaga wyłączania SIP w El Capitan.
Aaron D
Dzięki za wyjaśnienie @Caleb :) :) (Y)
Sachin Malhotra
59

Odkryłem, że istnieje inne rozwiązanie tego problemu, zamiast tworzyć dowiązanie symboliczne.

Ustawiasz ścieżkę do swojego katalogu, w którym znajduje się libmysqlclient.18.dylib, na zmienną środowiskową DYLD_LIBRARY_PATH. To, co zrobiłem, to umieścić następujący wiersz w moim .bash_profile:

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

Otóż ​​to.

yoshi
źródło
7
w / usr / local / mysql znajduje się również dowiązanie symboliczne, które wskazuje na zainstalowaną wersję, więc sugeruję zmianę linii na: export DYLD_LIBRARY_PATH = / usr / local / mysql / lib /: $ DYLD_LIBRARY_PATH
się
37

W moim przypadku otrzymywałem błąd w systemie Mac OS X 10.9 Mavericks. Zainstalowałem MySQL Community Server bezpośrednio z witryny Oracle / MySQL firmy DMG.

Wszystko, co musiałem zrobić, to dowiązać symboliczne pliki lib do katalogu / usr / local / lib.

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

Bonus: jeśli używasz również Mac OS X, istnieje świetne narzędzie do wyszukiwania plików, takich jak plik libmysqlclient.18.dylib, http://apps.tempel.org/FindAnyFile . W ten sposób pierwotnie znalazłem lokalizację pliku dylib.

Nick Woodhams
źródło
1
Musiałem stworzyć /usr/local/libkatalog, ale działałem jak marzenie!
Nick Merrill
25

Odkryłem, że umieszczenie tego w twoim .profile lub .bashrc (cokolwiek używasz) jest najłatwiejszym sposobem na zrobienie tego, linki symboliczne są niechlujne w porównaniu do utrzymywania ścieżek w plikach źródłowych.

Również w porównaniu z odpowiedzią yoshisurfs, przez większość czasu, gdy mysql jest instalowany, nazwa katalogu mysql powinna zostać zmieniona na mysql, a nie całą nazwę pliku, aby ułatwić korzystanie z niego.

export DYLD_LIBRARY_PATH=/usr/local/mysql/lib:$DYLD_LIBRARY_PATH
Matthew Harrison
źródło
2
Wydaje się, że to naprawdę rozsądna i prosta odpowiedź. U mnie dobrze działało - dzięki!
Darragh Enright
4

Wpadłem na to z kilkoma środowiskami wirtualnymi.

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

Pracował za każdym razem.

John Redford
źródło
Pracowałem też dla mnie
czw
3

Dla osób używających homebrew możesz to naprawić za pomocą:

$ brew link mysql
keithpjolley
źródło
To zadziałało dla mnie, utworzyło taki link: /usr/local/lib/libmysqlclient.18.dylib -> /usr/local/Cellar/mysql/5.6.27/lib/libmysqlclient.18.dylib
Joshua Grigonis
2

W moim przypadku w El Capitan (OSX 10.11) muszę wykonać następujące czynności ~/.bash_profile

export DYLD_LIBRARY_PATH="/usr/local/mysql/lib:${DYLD_LIBRARY_PATH}"
export PATH="/usr/local/mysql/lib:${PATH}"
Krishna Sunuwar
źródło
2

kiedy jesteś w El Capitan, pojawi się błąd: ln: /usr/lib/libmysqlclient.18.dylib: Operation not permitted musisz zamknąć „Ochrona integralności systemu”.

najpierw uruchom ponownie i przytrzymaj cmd + R, aby przejść do trybu odzyskiwania, a następnie uruchom terminal i wpisz polecenie:, csrutil disableteraz możesz ponownie uruchomić komputer i spróbować ponownie.

yannisxu
źródło
Innym sposobem można przenieść pliku libmysqlclient.18.dylibdo /usr/local/libi dodać ścieżkę PATH=/usr/local/lib:$PATHdo bash_profile. To działa na mnie.
Bun Suwanparsert
1

W nowej instalacji El Capitan, gdzie SIP (rootless uniemożliwia dostęp do usr / lib /) jest domyślnie włączony i nie możesz utworzyć dowiązania symbolicznego, chyba że jesteś w trybie odzyskiwania. Jak powiedział @yannisxu, możesz wyłączyć SIP i zrobić swoje dowiązanie symboliczne do / usr / lib / local i to zadziała.

możesz użyć następującego polecenia na MAC OSX El Capitan zamiast wyłączać SIP:

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

Kiedyś istniała opcja, w której można było zalogować się jako root, co może wyłączyć SIP, ale w ostatecznej wersji, która jest teraz przestarzała, możesz przeczytać więcej na ten temat tutaj: https://forums.developer.apple.com/thread/4686

Pytanie:

W Developer Beta 1 dostępne jest polecenie nvram boot-args, które może wyłączyć SIP, gdy jest uruchamiane z uprawnieniami roota:

nvram boot-args="rootless=0"

Czy ta opcja wyłączenia SIP będzie również dostępna w wydanej wersji El Capitan? Czy jest to wyłącznie dla kompilacji deweloperskich?

Odpowiedź:

To polecenie nvram boot-args zniknie. Nie będzie dostępny w wydanej wersji El Capitan i może zniknąć przed końcem Developer Beta. Miej oko na informacje o wydaniu przyszłych wersji beta deweloperów.

mrkzq
źródło
0

Miałem ten problem i zajęło mi trochę czasu, zanim wymyśliłem, jak to naprawić.

Mój przypadek jest nieco inny. Serwer MySQL jest w wersji 5.1.x. W jakiś sposób zaktualizowałem MySQL-python z 1.2.3 do 1.2.5. I ciągle otrzymywałem ten problem od tego czasu, dodałem następujący miękki link.

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

Okazuje się, że dla MySQL 5.1.x nie ma biblioteki libmysqlclient.18.dylib, a jedynie libmysqlclient.16.dylib. Możesz rozwiązać ten problem, obniżając MySQL-python do wersji 1.2.3 lub aktualizując serwer MySQL do 5.6.x (nie próbowałem jeszcze 5.5.x.)

Zdegradowałem bibliotekę do wersji 1.2.3, ponieważ aktualizacja MySQL nie jest dla mnie opcją.

James J. Ye
źródło
0

przejdź do http://dev.mysql.com/downloads/connector/c/ i pobierz MySQL Connector / C. po otrzymaniu pakietu utwórz nowy katalog 'mysql', zdekompresuj plik Mysql Connector w katalogu mysql, a następnie w mysql, utwórz kolejny pusty katalog 'build'. użyjemy 'build' do zbudowania MySQL Connector / C. cd build && cmake ../your-MySQL-Connector-source-dir make && make install po make install, otrzymasz katalog o nazwie mysql w / usr / local. zawiera wszystkie potrzebne nagłówki i biblioteki. przejdź do tego katalogu i skopiuj nagłówki i biblioteki do odpowiednich lokalizacji.

user6643531
źródło
0

możesz spróbować:

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`
Xiaolin Leo
źródło
0

Uwaga o błędzie MySQL Connector / C na macOS (moja aktualna wersja to 10.13.2), napraw mysql_config i ponownie zainstaluj mysqlclient lub MySQL-python, oto szczegóły

Woody Huang
źródło