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?
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
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)
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.
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.
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
Je me suis heurté à cela avec quelques environnements virtuels.
pip uninstall MySQL-python
pip install -U MySQL-python
A travaillé les deux fois.
Pour ceux qui utilisent homebrew, vous pouvez résoudre ce problème avec:
$ brew link mysql
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
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.
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.
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}"
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
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.
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.
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`