Python mysqldb: libreria non caricata: libmysqlclient.18.dylib


172

Ho appena compilato e installato mysqldb per Python 2.7 sul mio Mac OS 10.6. Ho creato un semplice file di test che importa

import MySQLdb as mysql

Innanzitutto, questo comando è sottolineato in rosso e le informazioni indicano "Importazione non risolta". Quindi ho provato a eseguire il seguente semplice codice 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()

Durante l'esecuzione ottengo il seguente messaggio di errore

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

Quale potrebbe essere la soluzione al mio problema?

EDIT: In realtà ho scoperto che la libreria si trova in / usr / local / mysql / lib. Quindi devo dire alla mia versione di eclissi di Pydev dove trovarla. Dove lo imposto?

Risposte:


323

Ho risolto il problema creando un collegamento simbolico alla libreria. ie

La libreria attuale risiede in

/usr/local/mysql/lib

E poi ho creato un collegamento simbolico in

/usr/lib

Utilizzando il comando:

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

in modo che io abbia il seguente mapping:

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

Questo è stato. Dopo di che tutto ha funzionato bene.

MODIFICARE:

Si noti che a partire da MacOS El Capitan il System Integrity Protection (SIP, noto anche come "rootless") ti impedirà di creare collegamenti /usr/lib/. È possibile disabilitare SIP seguendo queste istruzioni , ma è possibile creare un collegamento in /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
hughes,

Avevo installato mysql55tramite MacPorts e per risolvere questo errore ho fatto:sudo ln -s mysql/libmysqlclient.18.dylib /opt/local/lib/mysql55/libmysqlclient.18.dylib
Philfreo,

Dopo che Mavericks ha rimosso il mio vecchio symlink, ho dovuto ricollegare da un punto leggermente diverso: sudo ln -s /usr/local/mysql-5.5.29-osx10.6-x86_64/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
Matt

2
Dovrai disabilitare SIP se stai eseguendo su El Capitan: forum.developer.apple.com/thread/7935 .
Joshua Pinter,

Dopo una nuova installazione di El Capitan, ho scoperto che non è necessario disabilitare SIP per questo suggerimento.
Lonoshea,

135

Il mio metodo preferito è quello di correggere effettivamente la libreria piuttosto che giocare con variabili di ambiente che potrebbero o meno essere nell'ambito nell'ambito di come viene eseguita l'applicazione. Questo è in realtà un processo abbastanza semplice.

Innanzitutto, guarda l'output dell'errore per vedere dove si trova il modulo Python offensivo:

ImportError: dlopen (/Library/Python/2.7/site-packages/_mysql.so, 2): Libreria non caricata: libmysqlclient.18.dylib Citato da: /Library/Python/2.7/site-packages/_mysql.so Motivo: immagine non trovata

Va bene, quindi il file offensivo è /Library/Python/2.7/site-packages/_mysql.so

Quindi, scopri dove _mysql.so pensa che dovrebbe trovare 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)

Quindi, sta cercando libmysqlclient.18.dylib senza informazioni sul percorso, aggiustiamo che:

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

Ora _mysql.so conosce il percorso completo della libreria e tutto funziona, indipendentemente dalle variabili di ambiente.

% 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
Non sarebbe una soluzione ancora migliore in modo da risolverlo con tutte le virtualenv? sudo nome_installazione_tool -cambia libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib $ VIRTUAL_ENV / lib / python2.7 / site-pacchetti / _mysql.so
Brad Ruderman

1
@BradRuderman Immagino sia importante chiarire che quando esegui il comando che hai dato, correggi solo un virtualenv - quello attuale. Inoltre, non tutti sono (a loro detrimento) in esecuzione in un virtual virtual, quindi quella riga di comando non sarebbe una soluzione così generale come quella pubblicata.
GreenAsJade,

1
Nota importante che l'esempio fornito sta risolvendo il python / mysql globale che dovrai correggere in ciascuno dei tuoi ambienti virtuali. Se sei come me, hai smaltato la prima parte in cui si trovano _mysql.Questo è un passo importante.
Ben Rabidou,

Funziona con _mysql.so installato all'interno di VirtualEnvironments e non richiede la disabilitazione di SIP in El Capitan.
Aaron D

Grazie per la spiegazione @Caleb :) :) (Y)
Sachin Malhotra il

59

Ho scoperto che c'era un'altra soluzione per questo problema piuttosto che creare un collegamento simbolico.

Devi impostare il percorso della tua directory, dove risiede libmysqlclient.18.dylib, su DYLD_LIBRARY_PATH variabile d'ambiente. Quello che ho fatto è stato quello di inserire la seguente riga nel mio .bash_profile:

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

Questo è tutto.


7
c'è anche un link simbolico in / usr / local / mysql che punta alla versione installata, quindi suggerisco di cambiare la linea in: export DYLD_LIBRARY_PATH = / usr / local / mysql / lib /: $ DYLD_LIBRARY_PATH
sneak

37

Nel mio caso, stavo ottenendo l'errore con Mac OS X 10.9 Mavericks. Ho installato MySQL Community Server direttamente dal sito Web Oracle / MySQL di DMG.

Tutto quello che dovevo fare era collegare simbolicamente i file lib alla directory / usr / local / lib.

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

Bonus: se usi anche Mac OS X, c'è un ottimo strumento per trovare file come il file libmysqlclient.18.dylib, http://apps.tempel.org/FindAnyFile . Questo è il modo in cui inizialmente ho trovato la posizione del file dylib.


1
Ho dovuto creare la /usr/local/libdirectory, ma ha funzionato come un fascino!
Nick Merrill,

25

Ho scoperto che metterlo nel tuo .profile o .bashrc (qualunque cosa tu usi) è il modo più semplice per farlo, i collegamenti sym sono disordinati rispetto al mantenere i percorsi nei tuoi file sorgente.

Inoltre, rispetto alla risposta di yoshisurfs, la maggior parte delle volte in cui mysql viene installata, la directory mysql dovrebbe essere rinominata in mysql, non nel nome completo del file, per facilità d'uso.

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

2
Sembra una risposta davvero sana e semplice. Ha funzionato bene per me - grazie!
Darragh Enright,

4

Mi sono imbattuto in questo con un paio di ambienti virtuali.

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

Ha funzionato entrambe le volte.


Ha funzionato anche per me
Tho


3

Per coloro che usano homebrew potresti risolvere questo problema con:

$ brew link mysql

Questo ha funzionato per me, ha creato un link come questo: /usr/local/lib/libmysqlclient.18.dylib -> /usr/local/Cellar/mysql/5.6.27/lib/libmysqlclient.18.dylib
Joshua Grigonis

2

Nel mio caso, a El Capitan (OSX 10.11), devo seguire ~/.bash_profile

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

2

quando ti trovi a El Capitan, verrà visualizzato l'errore: è ln: /usr/lib/libmysqlclient.18.dylib: Operation not permitted necessario chiudere la "Protezione dell'integrità del sistema".

prima riavvia e tieni premuto cmd + R per accedere alla modalità di ripristino, quindi avvia il terminale e digita il comando:, csrutil disableora puoi riavviare e riprovare.


Un altro modo è possibile spostare il file libmysqlclient.18.dylibdi /usr/local/libe aggiungere il percorso PATH=/usr/local/lib:$PATHa bash_profile. Funziona per me.
Bun Suwanparsert,

1

Nella nuova installazione di El Capitan in cui SIP (rootless impedisce l'accesso a usr / lib /) è attivo per impostazione predefinita e non è possibile creare il collegamento simbolico se non si è in modalità di ripristino. Come ha detto @yannisxu, puoi disabilitare SIP e fare il tuo link simbolico a / usr / lib / local e questo funzionerà.

puoi usare il seguente comando su MAC OSX El Capitan invece di disattivare SIP:

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

C'era un'opzione in cui è possibile accedere come root e questo può disabilitare SIP ma nella versione finale che ora è obsoleta, puoi leggere di più qui: https://forums.developer.apple.com/thread/4686

Domanda:

Esiste un comando nvram boot-args disponibile in Developer Beta 1 che può disabilitare SIP quando eseguito con i privilegi di root:

nvram boot-args="rootless=0"

Questa opzione di disabilitazione di SIP sarà disponibile anche nella versione di rilascio di El Capitan? O questo è rigorosamente per le build degli sviluppatori?

Risposta:

Questo comando nvram boot-args andrà via. Non sarà disponibile nella versione di rilascio di El Capitan e potrebbe scomparire prima della fine delle beta degli sviluppatori. Tieni d'occhio le note di rilascio per le future beta degli sviluppatori.


0

Ho avuto questo problema e mi ci è voluto un po 'di tempo per capire come risolverlo.

Il mio caso è leggermente diverso. Il mio server MySQL è della versione 5.1.x. E in qualche modo ho aggiornato il mio MySQL-Python dalla 1.2.3 alla 1.2.5. E ho continuato a riscontrare questo problema da allora, ho aggiunto il seguente soft link.

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

Si scopre che per MySQL 5.1.x non esiste libmysqlclient.18.dylib, ma solo libmysqlclient.16.dylib. Puoi risolvere questo problema eseguendo il downgrade di MySQL-python alla 1.2.3 o aggiornando il tuo server MySQL alla 5.6.x (non ho provato 5.5.x.)

Ho eseguito il downgrade della libreria alla 1.2.3 poiché l'aggiornamento di MySQL non è un'opzione per me.


0

vai su http://dev.mysql.com/downloads/connector/c/ e scarica MySQL Connector / C. dopo aver ottenuto il pacchetto, crea una nuova directory 'mysql', decomprimi il file Mysql Connector nella directory mysql, quindi sotto mysql, crea un'altra directory vuota 'build'. Useremo 'build' per costruire MySQL Connector / C. cd build && cmake ../your-MySQL-Connector-source-dir make && make install dopo make install, otterrai una directory chiamata mysql in / usr / local. contiene tutte le intestazioni e le librerie necessarie. vai in questa directory e copia le intestazioni e le librerie nelle posizioni corrispondenti.


0

Puoi provare:

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

Nota sui bug di MySQL Connector / C su macOS (la mia versione attuale è 10.13.2), correggi mysql_config e reinstalla mysqlclient o MySQL-python, ecco i dettagli

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.