macOS运行Python应用报libssl.1.1.dylib加载失败如何解决
执行brew upgrade后mysql-client被升级到8.0.29版本,该版本移除了自身lib目录下的OpenSSL动态库软链。你虚拟环境内安装的mysqlclient==1.4.6是升级前编译的C扩展,二进制文件硬编码了旧路径下libssl.1.1.dylib的加载地址,路径失效后直接触发动态库加载报错。
以下三种方案任选其一即可,按推荐优先级排序:
方案1:重新编译mysqlclient(长期稳定,推荐)
先在当前激活的虚拟环境中配置编译依赖的环境变量,让安装过程能正确找到brew安装的openssl和mysql-client头文件、动态库:export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib -L/usr/local/opt/mysql-client/lib" export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include -I/usr/local/opt/mysql-client/include"清除旧版本安装缓存,重新从源码编译安装对应版本的mysqlclient:
pip uninstall -y mysqlclient pip install --no-binary :all: mysqlclient==1.4.6安装完成后执行
python -c "import MySQLdb",无输出即代表修复成功。方案2:手动创建软链(最快临时修复)
系统中已经通过brew安装了openssl@1.1,直接把缺失的动态库软链到mysql-client的lib目录下即可:ln -s /usr/local/opt/openssl@1.1/lib/libssl.1.1.dylib /usr/local/opt/mysql-client/lib/ ln -s /usr/local/opt/openssl@1.1/lib/libcrypto.1.1.dylib /usr/local/opt/mysql-client/lib/注意:该方案为临时修复,后续brew升级openssl或mysql-client时可能再次出现同类报错。
方案3:切换为纯Python实现的PyMySQL驱动(无C依赖)
你的依赖清单中已经声明了PyMySQL==0.10.1,该库是纯Python实现的MySQL驱动,完全兼容MySQLdb接口,不需要依赖本地C动态库。只需在项目入口文件的最顶部(所有MySQL相关导入语句之前)添加两行代码:import pymysql pymysql.install_as_MySQLdb()添加后无需修改任何SQLAlchemy、Flask-SQLAlchemy相关的业务代码,直接启动应用即可正常运行。
内容的提问来源于stack exchange,提问作者dina

