web-dev-qa-db-fra.com

Python: MySQLdb et "Bibliothèque non chargée: libmysqlclient.16.dylib"

La mise en place...

J'ai essayé de configurer une installation propre de Mac os X 10.6 pour développer python/Django et je ne me souvenais pas de l'avoir rencontré sur 10.5.

Après avoir installé MySQL à partir du programme d'installation sur mysql-5.5.8-osx10.6-x86_64.dmg Iran

$ Sudo pip install MySQL-python

et cela a semblé se dérouler sans problème (sortie ci-dessous)

Downloading/unpacking MySQL-python
  Downloading MySQL-python-1.2.3.tar.gz (70Kb): 70Kb downloaded
  Running setup.py Egg_info for package MySQL-python
    warning: no files found matching 'MANIFEST'
    warning: no files found matching 'ChangeLog'
    warning: no files found matching 'GPL'
Installing collected packages: MySQL-python
  Running setup.py install for MySQL-python
    building '_mysql' extension
    gcc-4.2 -fno-strict-aliasing -fno-common -dynamic -DNDEBUG -g -fwrapv -Os -Wall -Wstrict-prototypes -DENABLE_DTRACE -pipe -Dversion_info=(1,2,3,'final',0) -D__version__=1.2.3 -I/usr/local/mysql/include -I/System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6 -c _mysql.c -o build/temp.macosx-10.6-universal-2.6/_mysql.o -Os -g -fno-common -fno-strict-aliasing -Arch x86_64
    In file included from _mysql.c:36:
    /usr/local/mysql/include/my_config.h:325:1: warning: "SIZEOF_SIZE_T" redefined
    In file included from /System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6/Python.h:9,
                     from pymemcompat.h:10,
                     from _mysql.c:29:
    /System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6/pymacconfig.h:33:1: warning: this is the location of the previous definition
    In file included from _mysql.c:36:
    /usr/local/mysql/include/my_config.h:419:1: warning: "HAVE_WCSCOLL" redefined
    In file included from /System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6/Python.h:8,
                     from pymemcompat.h:10,
                     from _mysql.c:29:
    /System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6/pyconfig.h:803:1: warning: this is the location of the previous definition
    gcc-4.2 -Wl,-F. -bundle -undefined dynamic_lookup build/temp.macosx-10.6-universal-2.6/_mysql.o -L/usr/local/mysql/lib -lmysqlclient_r -lpthread -o build/lib.macosx-10.6-universal-2.6/_mysql.so -Arch x86_64
    warning: no files found matching 'MANIFEST'
    warning: no files found matching 'ChangeLog'
    warning: no files found matching 'GPL'
Successfully installed MySQL-python
Cleaning up...

après cela, j'ai essayé:

$ python -c "import MySQLdb"

et il m'a chié avec:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/Library/Python/2.6/site-packages/MySQLdb/__init__.py", line 19, in <module>
    import _mysql
ImportError: dlopen(/Library/Python/2.6/site-packages/_mysql.so, 2): Library not loaded: libmysqlclient.16.dylib
  Referenced from: /Library/Python/2.6/site-packages/_mysql.so
  Reason: image not found

Passons donc à ma question ...

Qu'est-ce que j'ai fait de mal?/Que dois-je faire d'autre?

Googler (et rechercher ici) pour cela renvoie beaucoup de résultats en obtenant ce message d'erreur avec Ruby pas trop avec Python tho.

59
rennat

_mysql.so fait référence à libmysqlclient.16.dylib. Autrement dit, la bibliothèque partagée qui sert de pont entre Python et la bibliothèque cliente MySQL, _mysql.so, fait référence à la bibliothèque dynamique de la bibliothèque cliente MySQL, et cette bibliothèque ne peut pas être chargée pour une raison quelconque.

Questions auxquelles vous devez répondre:

  • Y a t-il libmysqlclient.16.dylib n'importe où sur votre système? Sinon, vous devez installer le logiciel client MySQL.
  • Si tel est le cas, le répertoire contenant cette bibliothèque dans votre DYLD_LIBRARY_PATH réglage? Sinon, essayez de l'ajouter.
  • Si oui, vous devrez vous assurer que le libmysqlclient.16.dylib le fichier n'est pas corrompu. Ma copie, installée dans /opt/local/lib/mysql5/mysql/libmysqlclient.16.dylib, gracieuseté de MacPorts, possède la signature MD5 c79ee91af08057dfc269ee212915801a et a une taille de 1 462 376 octets. À quoi ressemble votre copie?
55
Brian Clapper

Réglez simplement le DYLD_LIBRARY_PATH après avoir exécuté pip install ou easy_install:

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

Devrait faire le travail en supposant que votre installation MySQL vit sous /usr/local/mysql.

92
lukmdo

Après easy_install, je crée un lien logiciel qui a résolu le problème

Sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib
41
msbanik

Il peut également apparaître si votre client MySQL est plus récent que votre package MySQL-python. Dans mon cas, j'avais un libmysqlclient_r.18.dylib sur ma machine, mais pas un libmysqlclient_r.16.dylib. Fonctionnement pip search mysql révélé

MySQL-python - Python avec MySQL INSTALLÉ: 1.2.3 DERNIÈRE: 1.2.3c1

et en cours d'exécution pip install --upgrade MySQL-python a résolu mon problème.

8
Catherine Devlin

Sur ma configuration (mysql 5.7.x de brew, pyenv), j'avais un fichier lib plus récent libmysqlclient.20.dylib. Ce qui a fonctionné était de pip uninstall MySQL-python et pip install MySQL-python.

7
Giannis

Sur la dernière version de MySQL 5.7.9 ce n'est pas supporté par MySQL-python et j'ai utilisé la bibliothèque PyMySQL à la place. J'ai aussi ajouté dans manage.py (dans Django) ces lignes pour émuler l'API de MySQL-python:

try:
    # load MySQLdb interface emulation
    import pymysql
    pymysql.install_as_MySQLdb()
except ImportError:
    pass
7
Anton Danilchenko

Pour ceux comme moi qui ont besoin - ou ont - MySQLdb et PyMySQL installés (dans mon cas, j'avais besoin d'avoir les deux installés parce que j'utilise PyMySQL pour me connecter à mes instances MySQL locales et MySQLDb pour les instances distantes/live):

Assurez-vous que vous utilisez le bon schéma d'URI. Pour accéder aux instances locales:

LOCAL_DATABASE_URI = 'mysql+pymysql://username:password@hostname/dbname'

et pour vivre:

REMOTE_DATABASE_URI = 'mysql+mysqldb://username:password@hostname/dbname'

Faire cette distinction a résolu le problème pour moi

0
kip2