177 votes

Python mysqldb : Bibliothèque non chargée : libmysqlclient.18.dylib

Je viens de compiler et d'installer mysqldb pour python 2.7 sur mon mac os 10.6. J'ai créé un simple fichier de test qui importe

import MySQLdb as mysql

Tout d'abord, cette commande est soulignée en rouge et l'info me dit "Unresolved import". Ensuite, j'ai essayé d'exécuter le code python simple suivant

import MySQLdb as mysql

def main():
    conn = mysql.connect( charset="utf8", use_unicode=True, host="localhost",user="root", passwd="",db="" )

if __name__ == '__main__'():
    main()

En l'exécutant, j'obtiens le message d'erreur suivant

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

Quelle pourrait être la solution à mon problème ?

EDIT : En fait, j'ai découvert que la bibliothèque se trouve dans /usr/local/mysql/lib. Je dois donc indiquer à ma version eclipse de pydev où la trouver. Où dois-je définir cela ?

324voto

toom Points 3002

J'ai résolu le problème en créant un lien symbolique vers la bibliothèque. C'est-à-dire

La bibliothèque actuelle se trouve dans

/usr/local/mysql/lib

Et puis j'ai créé un lien symbolique dans

/usr/lib

En utilisant la commande :

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

de sorte que j'ai le mappage suivant :

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

C'est tout. Après ça, tout a bien fonctionné.

EDIT :

Notez que, depuis MacOS El Capitan, la protection de l'intégrité du système (SIP, également connue sous le nom de "rootless") vous empêchera de créer des liens dans les sections suivantes /usr/lib/ . Vous pouvez désactiver SIP en suivant les étapes suivantes ces instructions mais vous pouvez créer un lien dans /usr/local/lib/ à la place :

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

47 votes

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

0 votes

J'avais installé mysql55 via MacPorts et pour résoudre cette erreur a fait : sudo ln -s mysql/libmysqlclient.18.dylib /opt/local/lib/mysql55/libmysqlclient.18.dylib

0 votes

Après que Mavericks ait supprimé mon ancien lien symbolique, j'ai dû établir un lien symbolique à partir d'un endroit légèrement différent : sudo ln -s /usr/local/mysql-5.5.29-osx10.6-x86_64/lib/libmysqlclient.18‌​.dylib /usr/lib/libmysqlclient.18.dylib

138voto

Caleb Shay Points 1316

Ma méthode préférée consiste à corriger la bibliothèque plutôt que de jouer avec des variables d'environnement qui peuvent ou non être utilisées en fonction de la façon dont l'application est exécutée. Il s'agit en fait d'un processus assez simple.

Tout d'abord, regardez la sortie d'erreur pour voir où se trouve le module python incriminé :

ImportError : dlopen(/Library/Python/2.7/site-packages/_mysql.so, 2) : Bibliothèque non chargée : libmysqlclient.18.dylib Référencé depuis : /Library/Python/2.7/site-packages/_mysql.so Motif : image non trouvée

Ok, donc le fichier incriminé est /Library/Python/2.7/site-packages/_mysql.so

Ensuite, déterminez où _mysql.so pense devoir trouver 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)

Donc, il cherche libmysqlclient.18.dylib sans information sur le chemin, réparons cela :

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

Maintenant, _mysql.so connaît le chemin complet de la bibliothèque et tout fonctionne, indépendamment des variables d'environnement.

% 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 votes

Ne serait-ce pas une solution encore meilleure pour que cela corrige le problème avec tous les virtualenvs ? sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib $VIRTUAL_ENV/lib/python2.7/site-packages/_mysql.so

1 votes

@BradRuderman Je pense qu'il est important de préciser que lorsque vous exécutez la commande que vous avez donnée, vous fixez un seul virtualenv - votre virtualenv actuel. En outre, tout le monde ne fonctionne pas (à son détriment) dans un virtualenv, de sorte que cette ligne de commande ne serait pas une solution aussi générale que celle postée.

1 votes

Remarque importante : l'exemple donné corrige le paramètre global python/mysql. Vous devrez le corriger dans chacun de vos environnements virtuels. Si vous êtes comme moi, vous passez directement sur la première partie où il y a l'emplacement _mysql.c'est donc une étape importante.

60voto

yoshisurfs Points 511

J'ai découvert qu'il existait une autre solution pour ce problème plutôt que de créer un lien symbolique.

Vous définissez le chemin vers votre répertoire, où réside libmysqlclient.18.dylib, dans la variable d'environnement DYLD_LIBRARY_PATH. Ce que j'ai fait est de mettre la ligne suivante dans mon .bash_profile :

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

C'est tout.

7 votes

Il y a aussi un lien symbolique dans /usr/local/mysql qui pointe vers la version installée, donc je suggère de changer votre ligne en : export DYLD_LIBRARY_PATH=/usr/local/mysql/lib/:$DYLD_LIBRARY_PATH

37voto

NickWoodhams Points 1746

Dans mon cas, j'ai obtenu l'erreur avec Mac OS X 10.9 Mavericks. J'ai installé MySQL Community Server directement à partir du site Web Oracle/MySQL de DMG.

Tout ce que j'avais à faire était d'établir un lien symbolique entre les fichiers lib et le répertoire /usr/local/lib.

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

Bonus : si vous utilisez également Mac OS X, il existe un excellent outil pour trouver des fichiers comme le fichier libmysqlclient.18.dylib, http://apps.tempel.org/FindAnyFile . C'est ainsi que j'ai trouvé à l'origine l'emplacement du fichier dylib.

1 votes

J'ai dû créer le /usr/local/lib mais il a fonctionné comme un charme !

26voto

Matthew Harrison Points 190

J'ai trouvé que mettre ceci dans votre .profile ou .bashrc (selon ce que vous utilisez) est la manière la plus facile de le faire, les liens sym sont désordonnés comparés à la conservation des chemins dans vos fichiers sources.

Par rapport à la réponse de yoshisurfs, la plupart du temps, lorsque mysql est installé, le répertoire mysql doit être renommé en mysql, et non pas en nom de fichier complet, pour faciliter l'utilisation.

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

2 votes

Cela semble être une réponse vraiment saine et simple. Elle a bien fonctionné pour moi - merci !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X