Python mysqldb: Bibliothek nicht geladen: libmysqlclient.18.dylib

172

Ich habe gerade mysqldb für Python 2.7 auf meinem Mac OS 10.6 kompiliert und installiert. Ich habe eine einfache Testdatei erstellt, die importiert wird

import MySQLdb as mysql

Erstens ist dieser Befehl rot unterstrichen und die Info sagt mir "Ungelöster Import". Dann habe ich versucht, den folgenden einfachen Python-Code auszuführen

import MySQLdb as mysql

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

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

Bei der Ausführung wird die folgende Fehlermeldung angezeigt

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

Was könnte die Lösung für mein Problem sein?

EDIT: Eigentlich habe ich herausgefunden, dass die Bibliothek in / usr / local / mysql / lib liegt. Also muss ich meiner Pydev-Eclipse-Version mitteilen, wo sie zu finden ist. Wo stelle ich das ein?

toom
quelle

Antworten:

323

Ich habe das Problem gelöst, indem ich einen symbolischen Link zur Bibliothek erstellt habe. Dh

Die eigentliche Bibliothek befindet sich in

/usr/local/mysql/lib

Und dann habe ich einen symbolischen Link in erstellt

/usr/lib

Verwenden des Befehls:

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

damit ich folgendes mapping habe:

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

Das war's. Danach hat alles gut funktioniert.

BEARBEITEN:

Beachten Sie, dass der Systemintegritätsschutz (SIP, auch als "rootless" bezeichnet) seit MacOS El Capitan das Erstellen von Links in verhindert /usr/lib/. Sie können SIP deaktivieren, indem Sie diese Anweisungen befolgen. Sie können jedoch /usr/local/lib/stattdessen einen Link erstellen in :

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib
toom
quelle
47
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
Hughes
Ich hatte mysql55über MacPorts installiert und um diesen Fehler zu sudo ln -s mysql/libmysqlclient.18.dylib /opt/local/lib/mysql55/libmysqlclient.18.dylib
beheben,
Nachdem Mavericks meinen alten Symlink entfernt hatte, musste ich von einer etwas anderen Stelle aus einen Symlink erstellen: sudo ln -s /usr/local/mysql-5.5.29-osx10.6-x86_64/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
Matt
2
Sie müssen SIP deaktivieren, wenn Sie mit El Capitan arbeiten: forums.developer.apple.com/thread/7935 .
Joshua Pinter
Nach einer Neuinstallation von El Capitan habe ich festgestellt, dass Sie SIP für diesen Tipp nicht deaktivieren müssen.
Lonoshea
135

Meine bevorzugte Methode besteht darin, die Bibliothek tatsächlich zu reparieren, anstatt mit Umgebungsvariablen zu spielen, die je nach Ausführung der Anwendung möglicherweise tatsächlich im Gültigkeitsbereich liegen oder nicht. Dies ist eigentlich ein ziemlich einfacher Prozess.

Sehen Sie sich zunächst die Fehlerausgabe an, um festzustellen, wo sich das fehlerhafte Python-Modul befindet:

ImportError: dlopen (/Library/Python/2.7/site-packages/_mysql.so, 2): Bibliothek nicht geladen: libmysqlclient.18.dylib Referenziert von: /Library/Python/2.7/site-packages/_mysql.so Grund: Bild nicht gefunden

Okay, die fehlerhafte Datei lautet /Library/Python/2.7/site-packages/_mysql.so

Als nächstes finden Sie heraus, wo _mysql.so meint, es sollte libmysqlclient.18.dylib finden:

% 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)

Es wird also nach libmysqlclient.18.dylib ohne Pfadinformationen gesucht. Lassen Sie uns das beheben:

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

Jetzt kennt _mysql.so den vollständigen Pfad zur Bibliothek und alles funktioniert, unabhängig von Umgebungsvariablen.

% 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
quelle
4
Wäre dies nicht eine noch bessere Lösung, um sie mit allen virtuellen Umgebungen zu beheben? sudo install_name_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 Ich denke, es ist wichtig klar zu sein, dass Sie beim Ausführen des von Ihnen angegebenen Befehls nur eine virtuelle Umgebung reparieren - Ihre aktuelle. Darüber hinaus läuft nicht jeder (zu seinem Nachteil) in einer virtuellen Umgebung, sodass die Befehlszeile keine so allgemeine Lösung darstellt wie die veröffentlichte.
GreenAsJade
1
Wichtiger Hinweis: Das angegebene Beispiel behebt das globale Python / MySQL, das Sie in jeder Ihrer virtuellen Umgebungen reparieren müssen. Wenn du wie ich bist, hast du direkt über dem ersten Teil, wo sie sich befinden, glasiert. Das ist ein wichtiger Schritt.
Ben Rabidou
Dies funktioniert für _mysql.so, das in VirtualEnvironments installiert ist, und erfordert keine Deaktivierung von SIP in El Capitan.
Aaron D
Danke für die Erklärung @Caleb :) :) (Y)
Sachin Malhotra
59

Ich fand, dass es eine andere Lösung für dieses Problem gab, anstatt eine symbolische Verknüpfung zu erstellen.

Sie legen den Pfad zu Ihrem Verzeichnis, in dem sich libmysqlclient.18.dylib befindet, auf die Umgebungsvariable DYLD_LIBRARY_PATH fest. Ich habe folgende Zeile in mein .bash_profile eingefügt:

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

Das ist es.

Yoshi
quelle
7
Es gibt auch einen Symlink unter / usr / local / mysql, der auf die installierte Version verweist. Ich empfehle daher, Ihre Zeile zu ändern in: export DYLD_LIBRARY_PATH = / usr / local / mysql / lib /: $ DYLD_LIBRARY_PATH
Sneak
37

In meinem Fall wurde der Fehler mit Mac OS X 10.9 Mavericks angezeigt. Ich habe MySQL Community Server direkt von der Oracle / MySQL-Website von DMG installiert.

Alles, was ich tun musste, war, die lib-Dateien mit dem Verzeichnis / usr / local / lib zu verknüpfen.

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

Bonus: Wenn Sie auch Mac OS X ausführen, gibt es ein großartiges Tool zum Auffinden von Dateien wie der libmysqlclient.18.dylib-Datei http://apps.tempel.org/FindAnyFile . So habe ich ursprünglich den Speicherort der Dylib-Datei gefunden.

Nick Woodhams
quelle
1
Ich musste das /usr/local/libVerzeichnis erstellen , arbeitete aber wie ein Zauber!
Nick Merrill
25

Ich fand, dass das Einfügen in Ihr .profile oder .bashrc (je nachdem, was Sie verwenden) der einfachste Weg ist. Sym-Links sind unübersichtlich im Vergleich zum Speichern von Pfaden in Ihren Quelldateien.

Im Vergleich zur Antwort von yoshisurfs sollte das mysql-Verzeichnis die meiste Zeit, wenn mysql installiert wird, aus Gründen der Benutzerfreundlichkeit nur in mysql und nicht in den gesamten Dateinamen umbenannt werden.

export DYLD_LIBRARY_PATH=/usr/local/mysql/lib:$DYLD_LIBRARY_PATH
Matthew Harrison
quelle
2
Dies scheint eine wirklich vernünftige und einfache Antwort zu sein. Hat gut für mich funktioniert - danke!
Darragh Enright
4

Ich bin mit ein paar virtuellen Umgebungen darauf gestoßen.

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

Arbeitete beide Male.

John Redford
quelle
Arbeitete auch für mich
Tho
3

Für diejenigen, die Homebrew verwenden, können Sie dies beheben mit:

$ brew link mysql
keithpjolley
quelle
Dies hat bei mir funktioniert und einen Link wie den folgenden erstellt: /usr/local/lib/libmysqlclient.18.dylib -> /usr/local/Cellar/mysql/5.6.27/lib/libmysqlclient.18.dylib
Joshua Grigonis
2

In meinem Fall muss ich in El Capitan (OSX 10.11) Folgendes tun ~/.bash_profile

export DYLD_LIBRARY_PATH="/usr/local/mysql/lib:${DYLD_LIBRARY_PATH}"
export PATH="/usr/local/mysql/lib:${PATH}"
Krishna Sunuwar
quelle
2

Wenn Sie in El Capitan sind, wird eine Fehlermeldung angezeigt: Sie ln: /usr/lib/libmysqlclient.18.dylib: Operation not permitted müssen den "System Integrity Protection" schließen.

Starten Sie zuerst neu und halten Sie cmd + R gedrückt, um in den Wiederherstellungsmodus zu wechseln. Starten Sie dann das Terminal und geben Sie den Befehl ein: csrutil disableJetzt können Sie neu starten und es erneut versuchen.

yannisxu
quelle
Eine andere Möglichkeit, eine Datei libmysqlclient.18.dylibzu verschieben /usr/local/libund einen Pfad PATH=/usr/local/lib:$PATHzu bash_profile hinzuzufügen. Es funktioniert für mich.
Bun Suwanparsert
1

Bei einer neuen El Capitan-Installation, bei der SIP (rootless verhindert den Zugriff auf usr / lib /) standardmäßig aktiviert ist und Sie den Symlink nur erstellen können, wenn Sie sich im Wiederherstellungsmodus befinden. Wie @yannisxu sagte, können Sie SIP deaktivieren und Ihren Symlink zu / usr / lib / local erstellen, und dies wird funktionieren.

Sie können den folgenden Befehl unter MAC OSX El Capitan verwenden, anstatt SIP auszuschalten:

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

Früher gab es eine Option, bei der Sie sich als Root anmelden und dadurch SIP deaktivieren können. In der endgültigen Version, die jetzt veraltet ist, können Sie hier mehr darüber lesen: https://forums.developer.apple.com/thread/4686

Frage:

In Developer Beta 1 ist ein Befehl nvram boot-args verfügbar, mit dem SIP deaktiviert werden kann, wenn es mit Root-Rechten ausgeführt wird:

nvram boot-args="rootless=0"

Wird diese Option zum Deaktivieren von SIP auch in der El Capitan-Release-Version verfügbar sein? Oder ist dies ausschließlich für die Developer Builds?

Antworten:

Dieser Befehl nvram boot-args wird gelöscht. Es wird in der El Capitan-Release-Version nicht verfügbar sein und möglicherweise vor dem Ende der Entwickler-Betas verschwinden. Behalten Sie die Versionshinweise für zukünftige Entwickler-Betas im Auge.

mrkzq
quelle
0

Ich hatte dieses Problem und es dauerte eine Weile, bis ich herausgefunden hatte, wie ich das beheben konnte.

Mein Fall ist etwas anders. Mein MySQL-Server hat die Version 5.1.x. Und irgendwie habe ich mein MySQL-Python von 1.2.3 auf 1.2.5 aktualisiert. Und seitdem habe ich dieses Problem immer wieder bekommen, obwohl ich den folgenden Softlink hinzugefügt habe.

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

Es stellt sich heraus, dass es für MySQL 5.1.x keine libmysqlclient.18.dylib gibt, sondern nur libmysqlclient.16.dylib. Sie können dieses Problem beheben, indem Sie entweder Ihr MySQL-Python auf 1.2.3 herunterstufen oder Ihren MySQL-Server auf 5.6.x aktualisieren (ich habe 5.5.x nicht ausprobiert).

Ich habe die Bibliothek auf 1.2.3 heruntergestuft, da ein Upgrade von MySQL für mich keine Option ist.

James J. Ye
quelle
0

Gehen Sie zu http://dev.mysql.com/downloads/connector/c/ und laden Sie MySQL Connector / C herunter. Nachdem Sie das Paket erhalten haben, erstellen Sie ein neues Verzeichnis 'mysql', dekomprimieren Sie die Mysql Connector-Datei unter dem Verzeichnis mysql und erstellen Sie dann unter mysql ein weiteres leeres Verzeichnis 'build'. Wir verwenden 'build', um MySQL Connector / C zu erstellen. cd build && cmake ../your-MySQL-Connector-source-dir make && make install nach make install erhalten Sie ein Verzeichnis mit dem Namen mysql unter / usr / local. Es enthält alle Header und Bibliotheken, die Sie benötigen. Gehen Sie in dieses Verzeichnis und kopieren Sie die Header und Bibliotheken an die entsprechenden Speicherorte.

user6643531
quelle
0

Du kannst es versuchen:

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
quelle
0

Hinweis zum Fehler von MySQL Connector / C unter macOS (meine aktuelle Version ist 10.13.2), beheben Sie die mysql_config und installieren Sie mysqlclient oder MySQL-python neu. Hier ist das Detail

Woody Huang
quelle