Python: MySQLdb y “Biblioteca no cargada: libmysqlclient.16.dylib”

La puesta en marcha…

Intentando configurar una instalación limpia de Mac OS X 10.6 para desarrollar python / django y no recuerdo haber encontrado esto en 10.5.

Después de instalar MySQL desde el instalador en mysql-5.5.8-osx10.6-x86_64.dmg ejecuté

 $ sudo pip install MySQL-python 

y parecía ir bien (salida abajo)

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

después de esto intenté:

 $ python -c "import MySQLdb" 

y me cagó con:

 Traceback (most recent call last): File "", line 1, in  File "/Library/Python/2.6/site-packages/MySQLdb/__init__.py", line 19, in  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 

Así que en mi pregunta …

¿Qué hice mal? / ¿Qué más debo hacer?

Al buscar en Google (y buscar aquí), se obtienen muchos resultados al recibir este mensaje de error con Ruby, no demasiados con Python Tho.

_mysql.so refiere a libmysqlclient.16.dylib . Es decir, la biblioteca compartida que sirve como puente entre Python y la biblioteca del cliente MySQL, _mysql.so , se refiere a la biblioteca dinámica para la biblioteca del cliente MySQL, y esa biblioteca no se puede cargar por alguna razón.

Preguntas que debes responder:

  • ¿Hay un libmysqlclient.16.dylib algún lugar de su sistema? Si no, necesita instalar el software de cliente MySQL.
  • Si es así, ¿está el directorio que contiene esa biblioteca en su configuración DYLD_LIBRARY_PATH ? Si no, intente agregarlo.
  • Si es así, deberá asegurarse de que el archivo libmysqlclient.16.dylib no esté dañado. Mi copia, instalada en /opt/local/lib/mysql5/mysql/libmysqlclient.16.dylib , cortesía de MacPorts, tiene la firma MD5 c79ee91af08057dfc269ee212915801a y tiene un tamaño de 1,462,376 bytes. ¿Cómo es tu copia?

Simplemente configure DYLD_LIBRARY_PATH después de ejecutar pip install o easy_install :

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

Debería hacer el trabajo asumiendo que su instalación de MySQL vive en /usr/local/mysql .

Después de easy_install, creo un enlace flexible que solucionó el problema.

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

También puede surgir si su cliente MySQL es más nuevo que su paquete MySQL-python. En mi caso, tuve un libmysqlclient_r.18.dylib en mi máquina, pero no un libmysqlclient_r.16.dylib. Ejecutando pip search mysql reveló

MySQL-python – Interfaz de Python para MySQL INSTALADO: 1.2.3 ACTUALIZADO: 1.2.3c1

y ejecutando pip install --upgrade MySQL-python solucionó mi problema.

En la última versión de MySQL 5.7.9 no es compatible con MySQL-python y en su lugar usé la biblioteca PyMySQL . También agregué en manage.py (en el proyecto Django) estas líneas para emular la API de MySQL-python:

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

En mi configuración (mysql 5.7.x de brew, pyenv), tenía un archivo lib más nuevo: libmysqlclient.20.dylib . Lo que funcionó fue pip uninstall MySQL-python y pip install MySQL-python .

Para aquellos que, como yo, necesitan o han instalado MySQLdb y PyMySQL (en mi caso, necesitaba tener ambos instalados porque uso PyMySQL para conectarme a mis instancias locales de MySQL y MySQLDb para instancias remotas / en vivo):

Asegúrese de que está utilizando el esquema de URI correcto. Para acceder a las instancias locales:

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

y para vivir:

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

Hacer esta distinción me solucionó el problema.