(苹果操作系统)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的引用,我确信这是问题的根本原因-显然,值是错误的。(我注意到的library-name是正确的。)坦率地说,我不熟悉这个@rpath的东西,也不知道到底是什么设置的。

谢谢你提前…

很抱歉问了这么多次这个问题…

系统完整性保护(SIP)显示为问题的根本原因。关闭它会导致库被找到,一旦它被添加到export DYLD_LIBRARY_PATH ...etc...

说明和解释可以在这里找到:https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection

根据Apple Developer网站,这会导致DYLD_LIBRARY_PATH的值被拒绝给子进程。显然,MySQL的Python接口必须在某个地方使用一个。做这样一件奇怪的事情如何有益于"系统完整性"?,但苹果一定有它的理由. ...)

供参考:我还从苹果的man dyld页面上发现了@RPATH的含义以及它的价值来自哪里。

最新更新