J'ai installé MySQL et Python avec Homebrew sur OS X 10.10.5 Yosemite. My Python 2.7 est à python -> ../Cellar/python/2.7.9/bin/python
avec un lien symbolique vers /usr/local/bin/python
.
Dans /usr/local/bin
il y a un lien symbolique:mysql -> ../Cellar/mysql/5.7.9/bin/mysql
Dans le Python Shell:
>>> import MySQLdb
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/site-packages/MySQLdb/__init__.py", line 19, in <module>
import _mysql
ImportError: dlopen(/usr/local/lib/python2.7/site-packages/_mysql.so, 2): Library not loaded: /usr/local/lib/libmysqlclient.18.dylib
Referenced from: /usr/local/lib/python2.7/site-packages/_mysql.so
Reason: image not found
J'ai donc essayé:$ Sudo unlink /usr/local/lib/libmysqlclient.18.dylib
suivi par:DYLD_LIBRARY_PATH=/usr/local/mysql/lib/:$DYLD_LIBRARY_PATH
puis (désespoir de raison):$ export DYLD_LIBRARY_PATH=/usr/local/Cellar/mysql/5.7.9/lib
Mais dans les deux cas import MySQLdb
essaie toujours d'importer libmysqlclient.18.dylib
.
J'ai ensuite essayé:$ pip install -U MySQL-python
et a obtenu: Requirement already up-to-date: MySQL-python in /usr/local/lib/python2.7/site-packages
Beaucoup réponsesà celaproblèmesur SO suggèrent de créer manuellement un lien symbolique explicite vers la bibliothèque avec un numéro de version (dans mon cas libmysqlclient.20.dylib
). Cependant, cela semble grossier et non à l'épreuve du temps, étant donné les liens symboliques existants:
dans /usr/local/lib
il y alibmysqlclient.dylib -> ../Cellar/mysql/5.7.9/lib/libmysqlclient.dylib
et en /usr/local/Cellar/mysql/5.7.9/lib
nous trouvons:libmysqlclient.20.dylib
avec un lien symbolique dans le même répertoire: libmysqlclient.dylib -> libmysqlclient.20.dylib
libmysqlclient.18.dylib
?Alors, comment puis-je obtenir Python pour oublier /usr/local/lib/libmysqlclient.18.dylib
et suivez le lien symbolique correct dans /usr/local/lib
à libmysqlclient.dylib
, sans ajouter manuellement un autre lien symbolique?
Cela a résolu mon problème sur mon cas:
$ pip uninstall MySQL-python
$ pip install mysqlclient
MySQL-python
s'est avéré très ancien (le dernier commit date de 7 ans). mysqlclient
en est la version moderne, avec de nombreuses améliorations et corrections de bugs.
J'ai également rencontré ce problème. J'ai désinstallé MySQL-python, puis l'ai installé.
pip uninstall MySQL-python
pip install MySQL-python
Mise à jour (basée sur les commentaires)
Dans certains cas, vous devrez peut-être effectuer la deuxième étape (installation) de la manière suivante:
pip install --no-binary MySQL-python MySQL-python
Le no-binary
L'option est pour que pip le compile et le relie à la bonne bibliothèque:
--no-binary <format_control>
N'utilisez pas de packages binaires. Peut être fourni plusieurs fois, et chaque fois ajoute à la valeur existante. Accepte: all: pour désactiver tous les packages binaires,: none: pour vider l'ensemble, ou un ou plusieurs noms de packages avec des virgules entre eux. Notez que certains packages sont difficiles à compiler et peuvent échouer à installer lorsque cette option est utilisée sur eux.
NB: Notez que MySQL-python
doit être mentionné deux fois . Comme mentionné ci-dessus, la première occurrence est le nom du package auquel appliquer le no-binary
option pour, la seconde spécifie le package à installer.
Vous devez utiliser la version dev de mysqlclient
:
pip install git+https://github.com/PyMySQL/mysqlclient-python.git@master
Avant j'avais la dernière version de PyPI (1.3.7) sur Python 3.4 et il cherchait libmysqlclient.18.dylib
(de MySQL 5.6) alors que je n'avais que libmysqlclient.20.dylib
(à partir de MySQL 5.7).
Si vous utilisez Python 3, MySQL-python
n'est pas une option (et mysqlclient
est sa version la plus récente).
En cas de problème avec manque de libmysqlclient.18.dylib
:
téléchargez mysql 5.6 depuis le lien officiel: https://dev.mysql.com/downloads/mysql/
installez-le
dans le terminal - mdfind libmysqlclient | grep .18.
copier la sortie
Sudo ln -s [the output from previous command] /usr/local/lib/libmysqlclient.18.dylib