Aggiornamento per chi usa Python3: Puoi semplicemente usare conda install mysqlclient
per installare le librerie necessarie per utilizzare MySQLdb così com'è attualmente esistente. La seguente domanda SO è stata un indizio utile:Python 3 ImportError:nessun modulo denominato 'ConfigParser'
. L'installazione di mysqlclient installerà mysqlclient, mysql-connector e llvmdev (almeno, ha installato queste 3 librerie sulla mia macchina).
Ecco il racconto della mia sconclusionata esperienza con questo problema. Mi piacerebbe vederlo modificato o generalizzato se hai una migliore esperienza del problema... applica un po' di quella magia SO.
Nota:i commenti nel paragrafo successivo si applicano a Snow Leopard, ma non a Lion, che sembra richiedere MySQL a 64 bit
Prima di tutto, l'autore (ancora?) di MySQLdb dice qui che uno dei problemi più perniciosi è che OS X viene installato con una versione a 32 bit di Python, ma la maggior parte dei joe medi (me compreso) probabilmente saltano per installare la versione a 64 bit di MySQL. Mossa sbagliata... rimuovi la versione a 64 bit se l'hai installata (le istruzioni su questa complicata attività sono disponibili su SO qui ), quindi scarica e installa la versione a 32 bit (pacchetto qui )
Esistono numerosi passaggi su come creare e installare le librerie MySQLdb. Spesso hanno sottili differenze. Questo mi è sembrato il più popolare e ha fornito la soluzione funzionante. L'ho riprodotto con un paio di modifiche di seguito
Passaggio 0: Prima di iniziare, presumo che tu abbia MySQL, Python e GCC installato sul Mac.
Passaggio 1: Scarica l'ultimo adattatore MySQL per Python da SourceForge.
Passaggio 2: Estrai il pacchetto scaricato:
tar xzvf MySQL-python-1.2.2.tar.gz
Passaggio 3: All'interno della cartella, pulisci il pacchetto:
sudo python setup.py clean
COPPIA DI PASSAGGI EXTRA, (da questo commento )
Fase 3b: Rimuovi tutto nella directory MySQL-python-1.2.2/build/* -- non fidarti che "python setup.py clean" lo faccia per te
Passaggio 3c: Rimuovi l'uovo in Utenti/$USER/.python-eggs
Passaggio 4: Inizialmente era necessario modificare _mysql.c, ma ora NON È PIÙ NECESSARIO. La community di MySQLdb sembra aver corretto questo bug ora.
Passaggio 5: Crea un collegamento simbolico sotto lib per puntare a una sottodirectory chiamata mysql. Qui è dove cerca durante la compilazione.
sudo ln -s /usr/local/mysql/lib /usr/local/mysql/lib/mysql
Passaggio 6: Modifica setup_posix.py e cambia quanto segue
mysql_config.path ="mysql_config"
a
mysql_config.path ="/usr/local/mysql/bin/mysql_config"
Passaggio 7: Nella stessa directory, ricostruisci il tuo pacchetto (ignora gli avvisi che ne derivano)
sudo python setup.py build
Passaggio 8: Installa il pacchetto e il gioco è fatto.
sudo python setup.py install
Passaggio 9: Prova se funziona. Funziona se puoi importare MySQLdb.
python
>>> import MySQLdb
Passaggio 10: Se durante il tentativo di importazione viene visualizzato un errore che si lamenta che Library not loaded: libmysqlclient.18.dylib
che termina con:Reason: image not found
devi creare un collegamento simbolico aggiuntivo che è:
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
Dovresti quindi essere in grado di import MySQLdb
senza errori.
Un ultimo inconveniente però è che se avvii Python dalla directory build otterrai questo errore:
/Library/Python/2.5/site-packages/MySQL_python-1.2.3c1-py2.5-macosx-10.5-i386.egg/_mysql.py:3:Avviso utente:il modulo _mysql è stato già importato da /Library/Python/2.5/ site-packages/MySQL_python-1.2.3c1-py2.5-macosx-10.5-i386.egg/_mysql.pyc, ma XXXX/MySQL-python-1.2.3c1 viene aggiunto a sys.path
Questo è abbastanza facile per Google, ma per risparmiarti il problema finirai per trovarti qui
(o forse no... non è un URL particolarmente a prova di futuro) e capisci che devi cd ..
fuori dalla directory build e l'errore dovrebbe scomparire.
Come ho scritto in alto, mi piacerebbe vedere questa risposta generalizzata, poiché ci sono numerose altre esperienze specifiche di questo orribile problema là fuori. Modifica via o fornisci la tua risposta migliore.