1 votes

(Monterey) La protection de l'intégrité du système pourrait-elle empêcher le chargement de la bibliothèque "MySQL" de Python3 ?

La bibliothèque d'interface client "MySQL" ne se charge pas sur MacOS Monterey. Les lignes de traceback correspondantes sont les suivantes : (Le système est Django, les dernières versions de tout).

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)

Il me semble que Python essaie d'utiliser @rpath pour trouver la bibliothèque, et man dyld m'explique de quoi il s'agit. Jusqu'à présent, tout va bien ...

J'ai précisé export DYLD_LIBRARY_PATH=/usr/local/mysql-8.0.31-macos12-X86_64/lib qui est l'emplacement correct, mais la bibliothèque n'est toujours pas trouvée. (Remarquez, à la fin de la ligne 2, qu'il semble utiliser @rpath explicitement en tant que partie du chemin de la bibliothèque recherchée). J'ai lu d'autres articles de forum sans rapport avec le sujet, qui fournissent les informations suivantes DYLD_LIBRARY_PATH comme solution, bien que dans l'environnement Linux.

Je ne sais pas comment faire voir ce que @rpath contient.

Je sais que "ça marchait avant", mais cela fait longtemps que je n'ai pas eu affaire à cette application et je ne me souviens franchement pas de la version de MacOS que j'utilisais à l'époque.

Est-il possible que la "protection de l'intégrité du système" ait quelque chose à voir avec cela ? J'ai lu que dans certains cas, cette variable d'environnement est bloquée, mais je ne vois pas très bien quand elle s'applique ou non.

L'interpréteur Python3 en question est situé dans un "environnement virtuel", ce qui signifie qu'il fonctionne en fait à partir d'un répertoire local de l'utilisateur et qu'il n'est donc pas couvert par le SIP. Mais les bibliothèques elles-mêmes résident dans /usr , qui est. J'ai reconstruit cet environnement virtuel.

1voto

Mike Robinson Points 164

Il semble que la protection de l'intégrité du système (SIP) était la cause profonde du problème. Le fait de le désactiver a permis de trouver la bibliothèque, une fois qu'elle avait été ajoutée à l'aide de la fonction export DYLD_LIBRARY_PATH ...etc...

Les instructions et explications sont disponibles ici : https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection

Selon le site web Apple Developer, cela entraîne la valeur de DYLD_LIBRARY_PATH d'être refusée à les processus de l'enfant. Et apparemment, l'interface Python pour MySQL doit en utiliser une quelque part. (Je ne vois pas en quoi une chose aussi étrange serait bénéfique pour "l'intégrité du système", mais Apple doit avoir ses raisons. ...)

POUR INFORMATION : J'ai également découvert sur le site d'Apple man dyld page quoi @RPATH et d'où vient sa valeur.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X