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ć?

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

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)

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.


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.


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

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.


Pracowałem też dla mnie
czw


3

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

$ brew link mysql

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}"

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.


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.


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ą.


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.


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`

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.