(MacOS) Django не может найти драйвер MySQL ... но почему?
Вот трассировка:
Exception in thread django-main-thread:
Traceback (most recent call last):
File "/Users/mike/.virtualenvs/djangoprod/lib/python3.10/site-packages/MySQLdb/__init__.py", line 18, in <module>
from . import _mysql
ImportError: dlopen(/Users/mike/.virtualenvs/djangoprod/lib/python3.10/site-packages/MySQLdb/_mysql.cpython-310-darwin.so, 0x0002): Library not loaded: '@rpath/libmysqlclient.21.dylib'
Referenced from: '/Users/mike/.virtualenvs/djangoprod/lib/python3.10/site-packages/MySQLdb/_mysql.cpython-310-darwin.so'
Reason: tried: '/usr/lib/libmysqlclient.21.dylib' (no such file)
И вот в чем проблема:
$ locate libmysqlclient
[...]
/usr/local/mysql-8.0.31-macos12-x86_64/lib/libmysqlclient.21.dylib
Итак, библиотека есть, но Django ее не находит. Итак, прежде чем я "бесполезно буду биться головой об эту штуку", особенно учитывая, что она раньше работала, может ли кто-нибудь любезно подтолкнуть меня в правильном направлении? Что я здесь упускаю?
Я особенно замечаю, что пакет пробует путь, /usr/lib...
когда это на самом деле не является правильным расположением здесь.
В частности: Я вижу в тексте ссылку на @rpath
, которая, я уверен, является первопричиной проблемы - очевидно, значение неверно. (Я заметил, что в нем правильно указано имя библиотеки). Я откровенно не знаком с этой штукой, и что именно ее задает.@rpath
Заранее благодарю...
Простите, что задавал этот вопрос так много раз...
Оказалось, что защита целостности системы (SIP) была первопричиной проблемы. Ее отключение привело к тому, что библиотека была найдена, как только она была добавлена с помощью export DYLD_LIBRARY_PATH ...etc...
Инструкции и объяснения можно найти здесь: https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection
Согласно сайту разработчиков Apple, это приводит к тому, что значение DYLD_LIBRARY_PATH
запрещается дочерним процессам. И, очевидно, интерфейс Python для MySQL должен где-то его использовать. (Каким образом такая странная вещь будет способствовать "целостности системы", мне совершенно непонятно, но у Apple должны быть свои причины. ...)
FYI: Я также узнал на странице man dyld
компании Apple, что означает @RPATH
и откуда берется его значение.