0 votos

(Monterey) ¿Es posible que la protección de integridad del sistema esté impidiendo que se cargue la biblioteca "MySQL" de Python3?

La biblioteca de la interfaz cliente "MySQL" no se carga en MacOS Monterey. Las líneas de rastreo relevantes son las siguientes: (El sistema es Django, últimas versiones de todo).

ImportError: dlopen(/Users/mike/.virtualenvs/djangoprod/lib/python3.11/site-packages/MySQLdb/_mysql.cpython-311-darwin.so, 0x0002): Library not loaded: '@rpath/libmysqlclient.21.dylib'
  Referenced from: '/Users/mike/.virtualenvs/djangoprod/lib/python3.11/site-packages/MySQLdb/_mysql.cpython-311-darwin.so'
  Reason: tried: '/usr/lib/libmysqlclient.21.dylib' (no such file)

Me parece que Python está intentando utilizar @rpath para encontrar la biblioteca, y man dyld me explica qué es eso. Hasta ahora, todo bien...

He especificado export DYLD_LIBRARY_PATH=/usr/local/mysql-8.0.31-macos12-X86_64/lib que es la ubicación correcta, pero la biblioteca sigue sin encontrarse. (Observa en la cola de la línea #2 que parece estar usando @rpath explícitamente como parte de la ruta de la biblioteca que se busca). He leído otros mensajes no relacionados en el foro que proporcionan DYLD_LIBRARY_PATH como solución, aunque en el entorno Linux.

No sé cómo véase qué @rpath contiene.

Sé que "esto solía funcionar", pero hace tiempo que no tengo nada que ver con esta aplicación y, francamente, no recuerdo qué versión de MacOS utilizaba entonces.

¿Es posible que la "Protección de la integridad del sistema" tenga algo que ver con esto? He leído que en ciertos casos bloquea esta variable de entorno, pero no me queda del todo claro cuándo sí y cuándo no.

El intérprete de Python3 en cuestión se encuentra en un "entorno virtual", lo que significa que en realidad se está ejecutando desde un directorio local de usuario que, por lo tanto, no estaría cubierto por SIP. Pero las bibliotecas sí residen en /usr que es. Reconstruí ese entorno virtual.

0voto

Mike Robinson Puntos 111

Parece que la protección de la integridad del sistema (SIP) fue root del problema. Al desactivarlo se encontró la biblioteca, una vez añadida con export DYLD_LIBRARY_PATH ...etc...

Las instrucciones y explicaciones pueden encontrarse aquí: https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection

Según el sitio web para desarrolladores de Apple, esto hace que el valor de DYLD_LIBRARY_PATH que se deniegue a procesos hijos. Y aparentemente, la interfaz de Python para MySQL debe usar uno en alguna parte. (No entiendo cómo puede beneficiar a la "integridad del sistema" hacer algo tan extraño, pero Apple debe tener sus razones...).

PARA SU INFORMACIÓN: También me enteré por Apple man dyld página qué @RPATH y de dónde procede su valor.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X