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


172

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

import MySQLdb as mysql

Premièrement, cette commande est soulignée en rouge et les informations me disent "Importation non résolue". 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()

Lors de son exécution, 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. J'ai donc besoin de dire à ma version pydev eclipse où le trouver. Où dois-je définir cela?

Réponses:


323

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

La bibliothèque actuelle réside 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'était ça. Après cela, tout a bien fonctionné.

ÉDITER:

Notez que depuis MacOS El Capitan, la protection de l'intégrité du système (SIP, également appelée «sans racine») vous empêchera de créer des liens dans /usr/lib/. Vous pouvez désactiver SIP en suivant ces instructions , mais vous pouvez créer un lien à la /usr/local/lib/place:

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

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

J'avais installé mysql55via MacPorts et pour résoudre cette erreursudo ln -s mysql/libmysqlclient.18.dylib /opt/local/lib/mysql55/libmysqlclient.18.dylib
j'ai

Après que Mavericks ait supprimé mon ancien lien symbolique, j'ai dû créer 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
Matt

2
Vous devrez désactiver SIP si vous utilisez El Capitan: forums.developer.apple.com/thread/7935 .
Joshua Pinter

Après une nouvelle installation d'El Capitan, j'ai constaté que vous n'avez pas besoin de désactiver SIP pour cette astuce.
Lonoshea

135

Ma méthode préférée est de réparer la bibliothèque plutôt que de jouer avec des variables d'environnement qui peuvent ou non être dans la portée en fonction de la façon dont l'application est exécutée. C'est en fait 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é à partir de: /Library/Python/2.7/site-packages/_mysql.so Raison: image non trouvée

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

Ensuite, déterminez où _mysql.so pense qu'il devrait 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 recherche libmysqlclient.18.dylib sans informations de chemin, corrigeons 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, quelles que soient les 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
Ne serait-ce pas une solution encore meilleure pour la corriger 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
Brad Ruderman

1
@BradRuderman Je suppose qu'il est important d'être clair que lorsque vous exécutez la commande que vous avez donnée, vous ne corrigez qu'un virtualenv - votre actuel. De plus, tout le monde ne fonctionne pas (à son détriment) dans un virtualenv, de sorte que la ligne de commande ne serait pas une solution aussi générale que celle publiée.
GreenAsJade

1
Remarque importante, l'exemple donné corrige le python / mysql global dont vous aurez besoin pour le corriger dans chacun de vos environnements virtuels. Si vous êtes comme moi, vous avez vitré juste au-dessus de cette première partie où ils se trouvent _mysql.so c'est une étape importante.
Ben Rabidou

Cela fonctionne pour _mysql.so installé dans VirtualEnvironments, et ne nécessite pas la désactivation de SIP dans El Capitan.
Aaron D

Merci pour l'explication @Caleb :) :) (Y)
Sachin Malhotra

59

J'ai trouvé qu'il y avait une autre solution à ce problème plutôt que de créer un lien symbolique.

Vous définissez le chemin de votre répertoire, où réside libmysqlclient.18.dylib, sur 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
il y a aussi un lien symbolique à / 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
sneak

37

Dans mon cas, j'obtenais 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 de créer 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
J'ai dû créer le /usr/local/librépertoire, mais j'ai travaillé comme un charme!
Nick Merrill

25

J'ai trouvé que mettre cela dans votre .profile ou .bashrc (selon ce que vous utilisez) est le moyen le plus simple de le faire, les liens sym sont désordonnés par rapport au maintien des chemins dans vos fichiers source.

Aussi comparé à la réponse de yoshisurfs, la plupart du temps, lorsque mysql est installé, le répertoire mysql doit être renommé juste en mysql, pas le nom complet du fichier, pour une facilité d'utilisation.

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

2
Cela semble être une réponse vraiment saine et simple. A bien fonctionné pour moi - merci!
Darragh Enright

4

J'ai rencontré cela avec quelques environnements virtuels.

pip uninstall MySQL-python
pip install -U MySQL-python

A travaillé les deux fois.


A travaillé pour moi aussi
Jeu


3

Pour ceux qui utilisent homebrew, vous pouvez résoudre ce problème avec:

$ brew link mysql

Cela a fonctionné pour moi, cela a créé un lien comme celui-ci: /usr/local/lib/libmysqlclient.18.dylib -> /usr/local/Cellar/mysql/5.6.27/lib/libmysqlclient.18.dylib
Joshua Grigonis

2

Dans mon cas, dans El Capitan (OSX 10.11), je dois suivre ~/.bash_profile

export DYLD_LIBRARY_PATH="/usr/local/mysql/lib:${DYLD_LIBRARY_PATH}"
export PATH="/usr/local/mysql/lib:${PATH}"

2

lorsque vous êtes à El Capitan, vous obtiendrez une erreur: vous ln: /usr/lib/libmysqlclient.18.dylib: Operation not permitted devez fermer la "Protection de l'intégrité du système".

Tout d'abord, redémarrez et maintenez cmd + R pour entrer en mode de récupération, puis lancez le terminal et tapez la commande csrutil disable:, vous pouvez maintenant redémarrer et réessayer.


Une autre façon vous pouvez déplacer le fichier libmysqlclient.18.dylibà /usr/local/libet ajouter le chemin PATH=/usr/local/lib:$PATHà bash_profile. Ça marche pour moi.
Bun Suwanparsert

1

Sur la nouvelle installation d'El Capitan où SIP (rootless empêche l'accès à usr / lib /) est activé par défaut et vous ne pouvez pas créer le lien symbolique sauf si vous êtes en mode de récupération. Comme @yannisxu l'a dit, vous pouvez désactiver SIP et créer votre lien symbolique vers / usr / lib / local et cela fonctionnera.

vous pouvez utiliser la commande suivante sur MAC OSX El Capitan au lieu de désactiver SIP:

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

Il y avait une option où vous pouvez vous connecter en tant que root et cela peut désactiver SIP, mais dans la version finale qui est maintenant obsolète, vous pouvez en savoir plus ici: https://forums.developer.apple.com/thread/4686

Question:

Il existe une commande nvram boot-args disponible dans Developer Beta 1 qui peut désactiver SIP lorsqu'elle est exécutée avec les privilèges root:

nvram boot-args="rootless=0"

Cette option de désactivation de SIP sera-t-elle également disponible dans la version finale d'El Capitan? Ou est-ce strictement pour les versions de développeur?

Répondre:

Cette commande nvram boot-args disparaîtra. Il ne sera pas disponible dans la version finale d'El Capitan et pourrait disparaître avant la fin des bêtas du développeur. Gardez un œil sur les notes de publication des futures versions bêta des développeurs.


0

J'ai eu ce problème et il m'a fallu un certain temps pour comprendre comment le résoudre.

Mon cas est légèrement différent. Mon serveur MySQL est de la version 5.1.x. Et d'une manière ou d'une autre, j'ai mis à niveau mon MySQL-python de 1.2.3 à 1.2.5. Et j'ai continué à avoir ce problème depuis lors, j'ai ajouté le lien logiciel suivant.

libmysqlclient.18.dylib -> /usr/local/mysql/lib/libmysqlclient.18.dylib

Il s'avère que pour MySQL 5.1.x, il n'y a pas de libmysqlclient.18.dylib, mais seulement libmysqlclient.16.dylib. Vous pouvez résoudre ce problème en rétrogradant votre MySQL-python en 1.2.3 ou en mettant à niveau votre serveur MySQL en 5.6.x (je n'ai pas essayé 5.5.x.)

J'ai rétrogradé la bibliothèque à la version 1.2.3 car la mise à niveau de MySQL n'est pas une option pour moi.


0

allez sur http://dev.mysql.com/downloads/connector/c/ et téléchargez MySQL Connector / C. après avoir récupéré le paquet, créez un nouveau répertoire 'mysql', décompressez le fichier Mysql Connector sous le répertoire mysql, puis sous mysql, créez un autre répertoire vide 'build'. Nous utiliserons 'build' pour construire MySQL Connector / C. cd build && cmake ../your-MySQL-Connector-source-dir make && make install après make install, vous obtiendrez un répertoire nommé mysql sous / usr / local. il contient tous les en-têtes et bibliothèques dont vous avez besoin. Allez dans ce répertoire et copiez les en-têtes et les bibliothèques aux emplacements correspondants.


0

tu peux essayer:

sudo install_name_tool -change libmysqlclient.18.dylib /Users/toom/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.6-intel.egg-tmp/_mysql.so`

0

Note sur le bogue de MySQL Connector / C sur macOS (ma version actuelle est 10.13.2), corrigez le mysql_config et réinstallez mysqlclient ou MySQL-python, voici le détail

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.