web-dev-qa-db-fra.com

MySQLdb de Python ne peut pas trouver libmysqlclient.dylib avec Homebrewed MySQL

MySQL et Python installé avec Homebrew

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

L'erreur

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

Réponses existantes

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 a
libmysqlclient.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

Comment faire Python oublier 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?

17
Dave Everitt

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.

8
Ranel Padon

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.

31
Aplusplus

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

13
Piotr Migdal

En cas de problème avec manque de libmysqlclient.18.dylib:

  1. téléchargez mysql 5.6 depuis le lien officiel: https://dev.mysql.com/downloads/mysql/

  2. installez-le

  3. dans le terminal - mdfind libmysqlclient | grep .18.

  4. copier la sortie

  5. Sudo ln -s [the output from previous command] /usr/local/lib/libmysqlclient.18.dylib

8
Dar Ben-Tov