2011-01-19 22 views
10

He descargado y seguido las instrucciones de instalación para MySQL 5.5.8 (http://dev.mysql.com/downloads/mysql/) y para el complemento MySQLdb python. (http://sourceforge.net/projects/mysql-python/)Python import MySQLdb error - Mac 10.6

Cuando intento importar MySQLdb a un terminal pitón, me sale el siguiente error:

Safira:~ yanigisawa$ python --version 
Python 2.6.1 
Safira:~ yanigisawa$ python -c "import MySQLdb" 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
    File "build/bdist.macosx-10.6-universal/egg/MySQLdb/__init__.py", line 19, in <module> 
    File "build/bdist.macosx-10.6-universal/egg/_mysql.py", line 7, in <module> 
    File "build/bdist.macosx-10.6-universal/egg/_mysql.py", line 6, in __bootstrap__ 
ImportError: dlopen(/Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so, 2): Library not loaded: libmysqlclient.16.dylib 
    Referenced from: /Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so 
    Reason: image not found 
Safira:~ yanigisawa$ 

encontré pregunta 4559699 de desbordamiento de pila, y ha seguido las instrucciones que:

Safira:~ yanigisawa$ echo $DYLD_LIBRARY_PATH 
/usr/local/mysql/lib 
Safira:~ yanigisawa$ ls -l /usr/local/mysql/lib 
total 363224 
-rwxr-xr-x 1 root wheel 3787328 Jan 18 19:41 libmysqlclient.16.dylib 
-rw-r--r-- 1 root wheel 10035336 Dec 3 13:26 libmysqlclient.a 
lrwxr-xr-x 1 root wheel  23 Jan 14 22:01 libmysqlclient.dylib -> libmysqlclient.16.dylib 
lrwxr-xr-x 1 root wheel  20 Jan 14 22:01 libmysqlclient_r.16.dylib -> libmysqlclient.dylib 
lrwxr-xr-x 1 root wheel  16 Jan 14 22:01 libmysqlclient_r.a -> libmysqlclient.a 
lrwxr-xr-x 1 root wheel  20 Jan 14 22:01 libmysqlclient_r.dylib -> libmysqlclient.dylib 
-rw-r--r-- 1 root wheel 88033760 Dec 3 13:22 libmysqld-debug.a 
-rw-r--r-- 1 root wheel 84075304 Dec 3 13:26 libmysqld.a 
-rw-r--r-- 1 root wheel  8472 Dec 3 13:26 libmysqlservices.a 
drwxr-xr-x 13 root wheel  442 Dec 3 13:53 plugin 
Safira:~ yanigisawa$ md5 /usr/local/mysql/lib/libmysqlclient.16.dylib 
MD5 (/usr/local/mysql/lib/libmysqlclient.16.dylib) = b8a78a93183720021b9dbe9ddad57111 
Safira:~ yanigisawa$ 

Y después de limpiar todos los archivos egg de Python, y la reconstrucción, todavía tengo el mismo error. Luego encontré el error 59006 (http://bugs.mysql.com/bug.php?id=59006) en MySQL 5.5.8 afectando Mac 10.6. Probé la solución de problemas indicada allí, limpié los huevos y los reconstruí, y sigo teniendo este error.

¿Existe otro problema para este problema específico de python? ¿Me estoy perdiendo algo más?

EDITAR: Adición de salida de los comandos otool:

Safira:~ yanigisawa$ otool -L /Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so 
/Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so: 
    libmysqlclient.16.dylib (compatibility version 16.0.0, current version 16.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1) 
Safira:~ yanigisawa$ otool -DX /usr/local/mysql/lib/libmysqlclient.16.dylib 
/usr/local/mysql/lib/libmysqlclient.16.dylib 
Safira:~ yanigisawa$ 

Respuesta

11

Usted podría intentar ejecutar otool para saber exactamente cuáles son los caminos de la biblioteca de la extensión MySQLdb C, _mysql.so está buscando:

$ otool -L /Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so 

y luego el nombre de la biblioteca instalada del archivo de la biblioteca MySQL:

$ otool -DX /usr/local/mysql/lib/libmysqlclient.16.dylib 

Pero no debería tener que recurrir a la configuración DYLD_LIBRARY_PATH (o usar install_name_tool para modificar un ejecutable); la necesidad de configurarlo es casi siempre una señal de que un componente fue construido o instalado incorrectamente. En mi experiencia, el proyecto MySQL no tiene un muy buen historial de coherencia en sus compilaciones e instaladores de OS X, ya que ese problema que citan tiende a confirmar.

Tratando de conseguir una combinación de trabajo de Python, MySQLdb y MySQL bibliotecas en OS X 10.6 es una causa muy común de frustración: un montón de preguntas acerca de él aquí en la SO y en otros lugares. Hay un número de razones para eso. Mi consejo es ir con una solución completa de uno de los distribuidores de terceros que creará e instalará versiones compatibles de todo lo que necesita. Y debería seguir funcionando si necesita actualizar los componentes a medida que pasa el tiempo. He tenido un buen éxito en los últimos años con MacPorts; otros prefieren Fink o el más reciente HomeBrew. Con MacPorts, después de instalar los archivos base de los MacPorts. dmg, usted puede conseguir todo lo construido de esta manera:

$ sudo port selfupdate # ensure the port files are up-to-date 
$ sudo port install py26-mysql 

El DarwinPorts Python estará disponible en /opt/local/bin/python2.6. Si está buscando ejecutar Django, también hay un puerto para eso.

EDITAR: Con la salida actualizada de otool, puede ver que hay una falta de coincidencia entre los nombres de las rutas de la biblioteca. La extensión MySQLdb está pidiendo un nombre de ruta relativa (sin inicial /), mientras que la biblioteca MySQL se anuncia con una ruta absoluta, normalmente lo que desea. Parece ser el reverso del problema 59006 de MySQL pero, sin saber exactamente qué pasos ha realizado hasta ahora, es realmente difícil decir cómo llegó a este estado.Usted puede poder usar install_name_tool para parchar el _mysql.so para tener el nombre de ruta absoluta que también eliminaría la necesidad de establecer DYLD_LIBRARY_PATH. Vale la pena probar:

$ cd ~/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp 
$ sudo install_name_tool -change libmysqlclient.16.dylib \ 
           /usr/local/mysql/lib/libmysqlclient.16.dylib \ 
         _mysql.so 

Pero eso no debería salir con una sensación cálida y difusa que se pueden reproducir los resultados cuando se necesita actualizar algo. Realmente no hay virtud en tratar de pegar todas estas piezas de diferentes fuentes en algo que funcione.

+0

Todavía soy nuevo en el sistema operativo Mac. (alrededor de 2 meses en adelante) Tenía la esperanza de obtener una "prueba de fuego", por así decirlo, y lograr que todo funcione de manera más o menos manual. Sin embargo, si no puedo hacer que esto funcione, recurriré a usar la opción de puertos mac. Gracias por la sugerencia. – yanigisawa

+0

La solución MacPorts finalmente funcionó. Instaló Python 2.6.6 junto con mi instalación 2.6.1, y/usr/bin/python aún apuntaba a 2.6.1, lo que causó que ocurriera el mismo error anterior con mis scripts de apache cgi. Tuve que agregar un enlace simbólico a la versión 2.6.6, y todo comenzó a funcionar bien. Gracias. – yanigisawa

+0

Me alegra escuchar. Pero cuidado: en general, es una muy mala idea sobrescribir cualquier cosa en '/ usr', que no sea'/usr/local'. Eso es todo lo que gestiona Apple como parte de OS X. No estoy seguro de si te referías a que sobreescribiste '/ usr/bin/python'. Maneras mucho mejores de manejar múltiples versiones es modificar los archivos de inicio de shell para poner '/ opt/local/Library/Frameworks/Python.framework/Versions/2.6/bin' al frente de' $ PATH' o usar una referencia absoluta al referir a Python, '/opt/local/bin/python2.6 '. –

49

En mi caso, he resuelto mediante la adición de un par de enlaces simbólicos como en http://ageekstory.blogspot.com/2011/04/installing-massive-coupon-on-mac-os-10.html

de la siguiente manera:

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

sudo ln -s /usr/local/mysql/lib /usr/local/mysql/lib/mysql

+0

+1: resolverlo aquí también =) –

+1

+1 esto es lo que finalmente resolvió mi problema después de muchas horas, incluso después de que la edición de Ned Deily pareció funcionar, pero no – cerberos

+0

+1 ¡esto funciona! TANX !!! – karantan

1

he intentado abordar el problema de una biblioteca dinámica sin descubrir mediante la compilación del módulo MySQLdb con bibliotecas estáticas (set static = True en site.cfg). Pero eso generó el mismo error, ya que _mysql.o todavía estaba pidiendo la biblioteca dinámica. Para solucionarlo, agregué libraries = [] al bloque para static en setup_posix.py.