Python mysqldb: Biblioteca no cargada: libmysqlclient.18.dylib

172

Acabo de compilar e instalar mysqldb para python 2.7 en mi mac os 10.6. Creé un archivo de prueba simple que importa

import MySQLdb as mysql

En primer lugar, este comando está subrayado en rojo y la información me dice "Importación no resuelta". Luego intenté ejecutar el siguiente código simple de Python

import MySQLdb as mysql

def main():
    conn = mysql.connect( charset="utf8", use_unicode=True, host="localhost",user="root", passwd="",db="" )

if __name__ == '__main__'():
    main()

Al ejecutarlo recibo el siguiente mensaje de error

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

¿Cuál podría ser la solución a mi problema?

EDITAR: En realidad descubrí que la biblioteca se encuentra en / usr / local / mysql / lib. Entonces necesito decirle a mi versión de Pydev Eclipse dónde encontrarlo. ¿Dónde configuro esto?

Toom
fuente

Respuestas:

323

Resolví el problema creando un enlace simbólico a la biblioteca. Es decir

La biblioteca real reside en

/usr/local/mysql/lib

Y luego creé un enlace simbólico en

/usr/lib

Usando el comando:

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

para que tenga el siguiente mapeo:

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

Eso fue todo. Después de eso todo funcionó bien.

EDITAR:

Tenga en cuenta que desde MacOS El Capitan, la Protección de integridad del sistema (SIP, también conocida como "sin raíz") le impedirá crear enlaces /usr/lib/. Puede deshabilitar SIP siguiendo estas instrucciones , pero puede crear un enlace en su /usr/local/lib/lugar:

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib
Toom
fuente
47
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
Hughes
Lo había instalado a mysql55través de MacPorts y para resolver este error:sudo ln -s mysql/libmysqlclient.18.dylib /opt/local/lib/mysql55/libmysqlclient.18.dylib
philfreo
Después de que Mavericks eliminó mi antiguo enlace simbólico, tuve que hacer un enlace simbólico desde un lugar ligeramente diferente: sudo ln -s /usr/local/mysql-5.5.29-osx10.6-x86_64/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
Matt
2
Tendrá que deshabilitar SIP si está ejecutando en El Capitan: forums.developer.apple.com/thread/7935 .
Joshua Pinter
Después de una nueva instalación de El Capitan, descubrí que no necesita deshabilitar SIP para este consejo.
Lonoshea
135

Mi método preferido es arreglar la biblioteca en lugar de jugar con variables de entorno que pueden o no estar dentro del alcance dependiendo de cómo se ejecute la aplicación. Este es en realidad un proceso bastante simple.

Primero, mire la salida de error para ver dónde se encuentra el módulo python infractor:

ImportError: dlopen (/Library/Python/2.7/site-packages/_mysql.so, 2): Biblioteca no cargada: libmysqlclient.18.dylib Referenciada desde: /Library/Python/2.7/site-packages/_mysql.so Motivo: imagen no encontrada

Bien, entonces el archivo ofensivo es /Library/Python/2.7/site-packages/_mysql.so

A continuación, descubra dónde _mysql.so cree que debería encontrar 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)

Entonces, está buscando libmysqlclient.18.dylib sin información de ruta, arreglemos eso:

% sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib /Library/Python/2.7/site-packages/_mysql.so

Ahora _mysql.so conoce la ruta completa a la biblioteca y todo funciona, independientemente de las variables de entorno.

% 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)
Caleb Shay
fuente
44
¿No sería esta una solución aún mejor, por lo que lo arregla con todos los virtualenvs? sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib $ VIRTUAL_ENV / lib / python2.7 / site-packages / _mysql.so
Brad Ruderman
1
@BradRuderman Supongo que es importante tener claro que cuando ejecutas el comando que has dado, solo arreglas un virtualenv: el actual. Además, no todos se ejecutan (en detrimento de ellos) en un virtualenv, por lo que esa línea de comando no sería una solución tan general como la publicada.
GreenAsJade
1
Nota importante: el ejemplo dado está arreglando el python / mysql global que necesitará arreglar en cada uno de sus entornos virtuales. Si eres como yo, viste la primera parte donde se encuentran _mysql.así que es un paso importante.
Ben Rabidou
Esto funciona para _mysql.so instalado dentro de VirtualEnvironments, y no requiere deshabilitar SIP en El Capitan.
Aaron D
Gracias por la explicación @Caleb :) :) (S)
Sachin Malhotra
59

Descubrí que había otra solución para este problema en lugar de crear un enlace simbólico.

Establece la ruta a su directorio, donde reside libmysqlclient.18.dylib, a la variable de entorno DYLD_LIBRARY_PATH. Lo que hice fue poner la siguiente línea en mi .bash_profile:

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

Eso es.

yoshi
fuente
77
también hay un enlace simbólico en / usr / local / mysql que apunta a la versión instalada, por lo que sugiero cambiar su línea a: export DYLD_LIBRARY_PATH = / usr / local / mysql / lib /: $ DYLD_LIBRARY_PATH
colarse el
37

En mi caso, recibí el error con Mac OS X 10.9 Mavericks. Instalé MySQL Community Server directamente desde el sitio web Oracle / MySQL de DMG.

Todo lo que necesitaba hacer era vincular los archivos lib al directorio / usr / local / lib.

mkdir -p /usr/local/lib   
ln -s /usr/local/mysql/lib/libmysql* /usr/local/lib

Bonificación: si también está ejecutando Mac OS X, existe una gran herramienta para encontrar archivos como el archivo libmysqlclient.18.dylib, http://apps.tempel.org/FindAnyFile . Así es como encontré originalmente la ubicación del archivo dylib.

Nick Woodhams
fuente
1
Tuve que crear el /usr/local/libdirectorio, ¡pero funcionó de maravilla!
Nick Merrill
25

Descubrí que poner esto en tu .profile o .bashrc (lo que uses) es la forma más fácil de hacerlo, los enlaces sym son desordenados en comparación con mantener rutas en tus archivos fuente.

También en comparación con la respuesta de yoshisurfs, la mayoría de las veces cuando se instala mysql, el directorio mysql debe renombrarse solo para mysql, no el nombre completo del archivo, para facilitar su uso.

export DYLD_LIBRARY_PATH=/usr/local/mysql/lib:$DYLD_LIBRARY_PATH
Matthew Harrison
fuente
2
Esto parece una respuesta realmente sensata y simple. Funcionó bien para mí, ¡gracias!
Darragh Enright
4

Me he encontrado con esto con un par de entornos virtuales.

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

Trabajó las dos veces.

John Redford
fuente
También funcionó para mí
Tho
3

Para aquellos que usan homebrew, puede solucionar esto con:

$ brew link mysql
keithpjolley
fuente
Esto funcionó para mí, creó un enlace como este: /usr/local/lib/libmysqlclient.18.dylib -> /usr/local/Cellar/mysql/5.6.27/lib/libmysqlclient.18.dylib
Joshua Grigonis
2

En mi caso, en El Capitan (OSX 10.11), tengo que hacer lo siguiente en ~/.bash_profile

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

cuando se encuentre en El Capitán, recibirá un error: ln: /usr/lib/libmysqlclient.18.dylib: Operation not permitted deberá cerrar la "Protección de integridad del sistema".

primero, reinicie y mantenga presionado cmd + R para ingresar al modo de recuperación, luego inicie la terminal y escriba el comando:, csrutil disableahora puede reiniciar e intentar nuevamente.

yannisxu
fuente
Otra forma en que puede mover el archivo libmysqlclient.18.dyliba /usr/local/liby agregar la ruta PATH=/usr/local/lib:$PATHa bash_profile. Me esta funcionando.
Bun Suwanparsert
1

En la nueva instalación de El Capitan, donde SIP (sin root impide el acceso a usr / lib /) está activado de forma predeterminada y no puede crear el enlace simbólico a menos que esté en modo de recuperación. Como @yannisxu dijo, puede deshabilitar SIP y hacer su enlace simbólico a / usr / lib / local y esto funcionará.

puede usar el siguiente comando en MAC OSX El Capitan en lugar de desactivar SIP:

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

Solía ​​haber una opción donde puede iniciar sesión como root y esto puede deshabilitar SIP, pero en la versión final que ahora está obsoleta, puede leer más sobre esto aquí: https://forums.developer.apple.com/thread/4686

Pregunta:

Hay un comando nvram boot-args disponible en Developer Beta 1 que puede deshabilitar SIP cuando se ejecuta con privilegios de root:

nvram boot-args="rootless=0"

¿Esta opción de deshabilitar SIP también estará disponible en la versión de lanzamiento de El Capitan? ¿O es estrictamente para las Builds de desarrollador?

Responder:

Este comando nvram boot-args desaparecerá. No estará disponible en la versión de lanzamiento de El Capitan y puede desaparecer antes del final de las versiones beta del desarrollador. Esté atento a las notas de la versión para futuros desarrolladores de Betas.

mrkzq
fuente
0

Tuve este problema y me llevó un tiempo descubrir cómo solucionarlo.

Mi caso es un poco diferente. Mi servidor MySQL es de la versión 5.1.x. Y de alguna manera actualicé mi MySQL-python de 1.2.3 a 1.2.5. Y seguí recibiendo este problema desde entonces, evento agregué el siguiente enlace suave.

libmysqlclient.18.dylib -> /usr/local/mysql/lib/libmysqlclient.18.dylib

Resulta que para MySQL 5.1.x no hay libmysqlclient.18.dylib, sino solo libmysqlclient.16.dylib. Puede solucionar este problema bajando su MySQL-python a 1.2.3 o actualizando su servidor MySQL a 5.6.x (no he probado 5.5.x.)

Reduje la versión de la biblioteca a 1.2.3 ya que actualizar MySQL no es una opción para mí.

James J. Ye
fuente
0

vaya a http://dev.mysql.com/downloads/connector/c/ y descargue MySQL Connector / C. después de obtener el paquete, cree un nuevo directorio 'mysql', descomprima el archivo del conector Mysql en el directorio mysql, luego, en mysql, cree otro directorio vacío 'build'. Usaremos 'build' para compilar MySQL Connector / C. cd build && cmake ../your-MySQL-Connector-source-dir make && make install después de realizar la instalación, obtendrá un directorio llamado mysql en / usr / local. contiene todos los encabezados y libs que necesita. vaya a este directorio y copie los encabezados y libs en las ubicaciones correspondientes.

usuario6643531
fuente
0

puedes probar:

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`
Xiaolin Leo
fuente
0

Nota sobre el error de MySQL Connector / C en macOS (mi versión actual es 10.13.2), corrige mysql_config y reinstala mysqlclient o MySQL-python, aquí está el detalle

Woody Huang
fuente