mysqldb mac python mysql homebrew mysql-python

mac - mysql python 3.6 connector windows 64 bit



MySQLdb de Python no puede encontrar libmysqlclient.dylib con MySQL de fabricaciĆ³n casera (4)

MySQL y Python instalados con Homebrew

Instalé MySQL y Python con Homebrew en OS X 10.10.5 Yosemite. My Python 2.7 está en python -> ../Cellar/python/2.7.9/bin/python con un enlace simbólico a él en /usr/local/bin/python .

En /usr/local/bin hay un enlace simbólico:
mysql -> ../Cellar/mysql/5.7.9/bin/mysql

El error

En el shell de Python:

>>> import MySQLdb Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python2.7/site-packages/MySQLdb/__init__.py", line 19, in <module> import _mysql ImportError: dlopen(/usr/local/lib/python2.7/site-packages/_mysql.so, 2): Library not loaded: /usr/local/lib/libmysqlclient.18.dylib Referenced from: /usr/local/lib/python2.7/site-packages/_mysql.so Reason: image not found

Así que intenté:
$ sudo unlink /usr/local/lib/libmysqlclient.18.dylib

seguido por:
DYLD_LIBRARY_PATH=/usr/local/mysql/lib/:$DYLD_LIBRARY_PATH

y luego (desesperación por la razón):
$ export DYLD_LIBRARY_PATH=/usr/local/Cellar/mysql/5.7.9/lib

Pero en ambos casos, import MySQLdb aún intentaba importar libmysqlclient.18.dylib .

Entonces intenté:
$ pip install -U MySQL-python y consiguió: Requirement already up-to-date: MySQL-python in /usr/local/lib/python2.7/site-packages

Respuestas existentes

Muchas answers a este problem en SO sugieren hacer manualmente un enlace simbólico explícito a la biblioteca con un número de versión (en mi caso libmysqlclient.20.dylib ). Sin embargo, esto parece crudo y no está preparado para el futuro, dados los enlaces simbólicos existentes:

en /usr/local/lib hay
libmysqlclient.dylib -> ../Cellar/mysql/5.7.9/lib/libmysqlclient.dylib

y en /usr/local/Cellar/mysql/5.7.9/lib encontramos:
libmysqlclient.20.dylib

con un enlace simbólico en el mismo directorio: libmysqlclient.dylib -> libmysqlclient.20.dylib

¿Cómo hacer que Python olvide libmysqlclient.18.dylib ?

Entonces, ¿cómo puedo hacer que Python olvide /usr/local/lib/libmysqlclient.18.dylib y siga el enlace simbólico correcto en /usr/local/lib a libmysqlclient.dylib , sin agregar manualmente otro enlace simbólico?


Esto resolvió mi problema en mi caso:

$ pip uninstall MySQL-python $ pip install mysqlclient

MySQL-python resultó ser muy antiguo (el último compromiso fue hace 7 años). mysqlclient es la versión moderna del mismo, con muchas mejoras y correcciones de errores.


Necesitas usar la versión dev de mysqlclient :

pip install git+https://github.com/PyMySQL/mysqlclient-python.git@master

Antes tenía la última versión de PyPI (1.3.7) en Python 3.4 y buscaba libmysqlclient.18.dylib (de MySQL 5.6) mientras que solo tenía libmysqlclient.20.dylib (de MySQL 5.7).

Si usa Python 3, MySQL-python no es una opción (y mysqlclient es su versión más reciente).


Si encuentra un problema con la falta de libmysqlclient.18.dylib :

  1. descargue mysql 5.6 desde el enlace oficial: https://dev.mysql.com/downloads/mysql/

  2. instalarlo

  3. en la terminal - mdfind libmysqlclient | grep .18. mdfind libmysqlclient | grep .18.

  4. copia la salida

  5. sudo ln -s [the output from previous command] /usr/local/lib/libmysqlclient.18.dylib


También me encontré con este problema. Desinstalé MySQL-python y luego lo instalé.

pip uninstall MySQL-python pip install MySQL-python

Actualización (basada en comentarios)

En algunos casos, es posible que deba realizar el segundo paso (instalar) de la siguiente manera:

pip install --no-binary MySQL-python MySQL-python

La opción no-binary es para que pip la compile de nuevo y se vincule a la biblioteca correcta:

--no-binary <format_control>

No utilice paquetes binarios. Puede suministrarse varias veces, y cada vez se agrega al valor existente. Acepta: todos: para deshabilitar todos los paquetes binarios,: ninguno: para vaciar el conjunto, o uno o más nombres de paquetes con comas entre ellos. Tenga en cuenta que algunos paquetes son difíciles de compilar y pueden no instalarse cuando se usa esta opción en ellos.

NB: Tenga en cuenta que MySQL-python debe mencionarse twice . Como se mencionó anteriormente, la primera aparición es el nombre del paquete al que se aplica la opción no-binary , la segunda especifica el paquete que se debe instalar.