web-dev-qa-db-fra.com

Python mysqldb: la bibliothèque n'est pas 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 fichier de test simple qui importe 

import MySQLdb as mysql

Tout d'abord, cette commande est soulignée en rouge et l'info me dit "importation non résolue". Ensuite, j'ai essayé de lancer 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 __== '__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 trouvait dans/usr/local/mysql/lib. Je dois donc indiquer à ma version pydev Eclipse où la trouver. Où est-ce que je place ceci?

167
toom

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

MODIFIER:

Notez que, depuis MacOS El Capitan, la protection de l’intégrité du système (SIP, également appelée "sans racine") vous empêche de créer des liens dans /usr/lib/. Vous pouvez désactiver SIP en suivant 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
319
toom

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 incluses dans la portée, en fonction de l'exécution de l'application. 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: /Bibliothèque/Python/2.7/site-packages/_mysql.so Raison: image non trouvée

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 cherche libmysqlclient.18.dylib sans information sur le 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 d'accès complet à 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)
132
Caleb Shay

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 d'accès à 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 fichier .bash_profile:

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

C'est tout.

56
yoshi

Dans mon cas, je recevais 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, c'était de faire 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 rechercher des fichiers tels que le fichier libmysqlclient.18.dylib, http://apps.tempel.org/FindAnyFile . Voici comment j’ai initialement trouvé l’emplacement du fichier Dylib. 

37
Nick Woodhams

Je trouve que le moyen le plus simple de le faire est de placer cela dans votre fichier .profile ou .bashrc (quel que soit votre choix), les liens sym sont compliqués par rapport à la conservation des chemins dans vos fichiers source. 

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

export DYLD_LIBRARY_PATH=/usr/local/mysql/lib:$DYLD_LIBRARY_PATH
20
Matthew Harrison

Je me suis heurté à cela avec quelques environnements virtuels.

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

A travaillé les deux fois.

3
John Redford

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

$ brew link mysql
3
keithpjolley

Dans le plug-in pydev Eclipse, vous pouvez définir la variable d'environnement pour DYLD. Le chemin peut être défini comme indiqué dans

Installer mysqldb sur snow leopard

3
Bharad

lorsque vous êtes dans El Capitan, vous obtiendrez l’erreur suivante: 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 la touche cmd + R pour passer en mode de récupération, puis lancez le terminal et tapez la commande: csrutil disable. Vous pouvez maintenant redémarrer et essayer à nouveau.

2
yannisxu

Sur la nouvelle installation 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 à moins d’être 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

Auparavant, il existait une option où vous pouvez vous connecter en tant que root et ceci peut désactiver SIP, mais dans la version finale qui est maintenant obsolète, vous pouvez en savoir plus à ce sujet ici: https://forums.developer.Apple .com/thread/4686

Question:

Il existe une commande nvram boot-args disponible dans la version bêta 1 du développeur 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 El Capitan? Ou est-ce strictement pour les versions de développeur?

Réponse:

Cette commande nvram boot-args va disparaître. Il ne sera pas disponible dans la version El Capitan et pourrait disparaître avant la fin des Betas pour développeurs. Gardez un œil sur les notes de publication pour les futures développeurs Betas.

1
mrkzq

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

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

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

0
Woody Huang

allez à 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 allons utiliser '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 les 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
user6643531

J'ai eu ce problème et il m'a fallu un certain temps pour trouver un moyen de résoudre ce problème.

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 à jour MySQL-python de 1.2.3 à 1.2.5. Et je continuais à avoir ce problème depuis lors, j’ai ajouté le lien virtuel 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 libmysqlclient.18.dylib, mais seulement libmysqlclient.16.dylib. Vous pouvez résoudre ce problème en rétrogradant votre MySQL-python vers la version 1.2.3 ou en mettant votre serveur MySQL à niveau vers la version 5.6.x (je n'ai pas essayé la version 5.5.x.).

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

0
James J. Ye

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
Xiaolin Leo