2011-01-19 9 views
10

Ho scaricato e seguito le istruzioni di installazione per MySQL 5.5.8 (http://dev.mysql.com/downloads/mysql/) e per il plugin python MySQLdb. (http://sourceforge.net/projects/mysql-python/)Errore Python di MySQLdb - Mac 10.6

Quando tento di importare MySQLdb ad un terminale pitone, ottengo l'errore sotto:

Safira:~ yanigisawa$ python --version 
Python 2.6.1 
Safira:~ yanigisawa$ python -c "import MySQLdb" 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
    File "build/bdist.macosx-10.6-universal/egg/MySQLdb/__init__.py", line 19, in <module> 
    File "build/bdist.macosx-10.6-universal/egg/_mysql.py", line 7, in <module> 
    File "build/bdist.macosx-10.6-universal/egg/_mysql.py", line 6, in __bootstrap__ 
ImportError: dlopen(/Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so, 2): Library not loaded: libmysqlclient.16.dylib 
    Referenced from: /Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so 
    Reason: image not found 
Safira:~ yanigisawa$ 

ho trovato questione 4559699 su stack overflow, e seguito le istruzioni non:

Safira:~ yanigisawa$ echo $DYLD_LIBRARY_PATH 
/usr/local/mysql/lib 
Safira:~ yanigisawa$ ls -l /usr/local/mysql/lib 
total 363224 
-rwxr-xr-x 1 root wheel 3787328 Jan 18 19:41 libmysqlclient.16.dylib 
-rw-r--r-- 1 root wheel 10035336 Dec 3 13:26 libmysqlclient.a 
lrwxr-xr-x 1 root wheel  23 Jan 14 22:01 libmysqlclient.dylib -> libmysqlclient.16.dylib 
lrwxr-xr-x 1 root wheel  20 Jan 14 22:01 libmysqlclient_r.16.dylib -> libmysqlclient.dylib 
lrwxr-xr-x 1 root wheel  16 Jan 14 22:01 libmysqlclient_r.a -> libmysqlclient.a 
lrwxr-xr-x 1 root wheel  20 Jan 14 22:01 libmysqlclient_r.dylib -> libmysqlclient.dylib 
-rw-r--r-- 1 root wheel 88033760 Dec 3 13:22 libmysqld-debug.a 
-rw-r--r-- 1 root wheel 84075304 Dec 3 13:26 libmysqld.a 
-rw-r--r-- 1 root wheel  8472 Dec 3 13:26 libmysqlservices.a 
drwxr-xr-x 13 root wheel  442 Dec 3 13:53 plugin 
Safira:~ yanigisawa$ md5 /usr/local/mysql/lib/libmysqlclient.16.dylib 
MD5 (/usr/local/mysql/lib/libmysqlclient.16.dylib) = b8a78a93183720021b9dbe9ddad57111 
Safira:~ yanigisawa$ 

E dopo aver pulito tutti i file egg Python e ricostruito, ho ancora lo stesso errore. Poi ho trovato l'errore 59006 (http://bugs.mysql.com/bug.php?id=59006) in MySQL 5.5.8 che riguardava Mac 10.6. Ho provato il work-around elencato lì, pulito le uova e ricostruito, e sto ancora ricevendo questo errore.

Esiste un altro aggettivo per questo problema specifico per Python? Mi manca qualcos'altro?

EDIT: Aggiunta di uscita dai comandi otool:

Safira:~ yanigisawa$ otool -L /Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so 
/Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so: 
    libmysqlclient.16.dylib (compatibility version 16.0.0, current version 16.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1) 
Safira:~ yanigisawa$ otool -DX /usr/local/mysql/lib/libmysqlclient.16.dylib 
/usr/local/mysql/lib/libmysqlclient.16.dylib 
Safira:~ yanigisawa$ 

risposta

11

Si potrebbe provare a eseguire otool per scoprire esattamente quali percorsi di libreria l'estensione MySQLdb C, _mysql.so è alla ricerca di:

$ otool -L /Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so 

e quindi il nome della libreria installata del file della libreria MySQL:

$ otool -DX /usr/local/mysql/lib/libmysqlclient.16.dylib 

Ma non dovresti ricorrere all'impostazione DYLD_LIBRARY_PATH (o usare install_name_tool per modificare un eseguibile); la necessità di impostarlo è quasi sempre un segno di un componente che è stato costruito o installato in modo errato. Nella mia esperienza, il progetto MySQL non ha un ottimo track record per coerenza nei build e negli installer di OS X, in quanto quel problema che si cita tende a confermare.

Cercando di ottenere una combinazione di lavoro di Python, MySQLdb, e MySQL librerie in OS X 10.6 è una causa molto comune di frustrazione: un sacco di domande su di esso qui su SO e altrove. Ci sono molte ragioni per questo. Il mio consiglio è di andare con una soluzione completa da uno dei distributori di terze parti che costruirà e installerà versioni compatibili di tutto ciò che serve. E dovrebbe continuare a funzionare se è necessario aggiornare i componenti con il passare del tempo. Ho avuto un buon successo nel corso degli anni con MacPorts; altri preferiscono Fink o il più recente HomeBrew. Con MacPorts, dopo aver installato i file di base da MacPorts. dmg, è possibile ottenere tutto costruito in questo modo:

$ sudo port selfupdate # ensure the port files are up-to-date 
$ sudo port install py26-mysql 

Il MacPorts Python sarà disponibile presso /opt/local/bin/python2.6. Se stai cercando di eseguire Django, c'è anche una porta per quello.

MODIFICA: con l'output aggiornato da otool, è possibile notare che c'è una mancata corrispondenza tra i nomi dei percorsi della libreria. L'estensione MySQLdb richiede un nome di percorso relativo (senza iniziale /), mentre la libreria MySQL si pubblicizza con un percorso assoluto, normalmente quello che si desidera. Sembra essere l'opposto del problema MySQL 59006 ma, senza sapere esattamente quali passi hai eseguito fino ad ora, è davvero difficile dire come sei arrivato a questo stato.È possibile in grado di utilizzare install_name_tool per applicare patch al valore _mysql.so in modo da avere il nome assoluto del percorso che eliminerebbe anche l'eventuale necessità di impostare DYLD_LIBRARY_PATH. Vale la pena di provare:

$ cd ~/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp 
$ sudo install_name_tool -change libmysqlclient.16.dylib \ 
           /usr/local/mysql/lib/libmysqlclient.16.dylib \ 
         _mysql.so 

Ma non si dovrebbe lasciare con una sensazione calda e sfocata che è possibile riprodurre i risultati quando è necessario aggiornare qualcosa. Non c'è davvero nessuna virtù nel cercare di incollare tutti questi pezzi da diverse fonti in qualcosa che funzioni.

+0

Sono ancora nuovo su Mac OS. (circa 2 mesi in ora) Speravo di ottenere una "prova di fuoco" per così dire e di far funzionare tutto più o meno in modo manuale. Tuttavia, se non riesco a farlo funzionare, ricorrerò all'utilizzo dell'opzione Mac Port. Grazie per il suggerimento. – yanigisawa

+0

Alla fine la soluzione MacPorts ha funzionato. Ha installato python 2.6.6 accanto alla mia installazione 2.6.1, e/usr/bin/python puntava ancora a 2.6.1, che ha causato lo stesso errore sopra riportato con i miei script apache cgi. Ho dovuto aggiungere un collegamento simbolico alla versione 2.6.6 e tutto ha funzionato correttamente. Grazie. – yanigisawa

+0

Felice di ascoltare. Ma attenzione: in generale, è una pessima idea sovrascrivere qualsiasi cosa in/usr', oltre a/usr/local. Tutto questo è gestito da Apple come parte di OS X. Non sono sicuro se volevi dire che hai sovrascritto '/ usr/bin/python'. I modi migliori per gestire più versioni è modificare i file di avvio della shell per mettere '/ opt/local/Library/Frameworks/Python.framework/Versions/2.6/bin' nella parte anteriore di' $ PATH' o utilizzare un riferimento assoluto quando si fa riferimento a in Python, '/opt/local/bin/python2.6 '. –

49

Nel mio caso, ho risolto con l'aggiunta di un paio di link simbolici come in http://ageekstory.blogspot.com/2011/04/installing-massive-coupon-on-mac-os-10.html

come segue:

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

sudo ln -s /usr/local/mysql/lib /usr/local/mysql/lib/mysql

+0

+1: risolverlo anche qui =) –

+1

+1 questo è quello che finalmente risolto il mio problema dopo molte ore, anche dopo la modifica di Ned deily sembrava funzionare, ma non ha fatto – cerberos

+0

+1 questo funziona! Tanx !!! – karantan

1

ho cercato di affrontare il problema di una libreria dinamiche infondata compilando il modulo MySQLdb con librerie statiche (set static = True in site.cfg). Ma questo ha generato lo stesso errore, dato che _mysql.o chiedeva ancora la libreria dinamica. Per risolvere il problema, ho aggiunto libraries = [] al blocco per se statico in setup_posix.py.

Problemi correlati