在macOS Sierra 10.12.6运行uWSGI时libexpat版本不兼容问题求助
解决macOS Sierra 10.12.6上uWSGI与libexpat版本冲突的问题
我之前在老版本macOS上也碰到过这种库版本不兼容的坑,尤其是brew管理的库和系统自带库“打架”的情况,给你几个亲测有效的修复方案:
方案一:编译uWSGI时指定brew的expat路径
大概率是uWSGI编译时还是调用了系统自带的旧版本expat,而非brew安装的新版本。我们可以在安装时强制指定依赖路径:
- 先卸载现有uWSGI:
pip uninstall -y uwsgi - 执行
brew --prefix expat,得到brew安装expat的根路径(比如/usr/local/Cellar/expat/2.5.0) - 用pip安装时通过CFLAGS和LDFLAGS指定expat的头文件和库路径:
CFLAGS="-I$(brew --prefix expat)/include" LDFLAGS="-L$(brew --prefix expat)/lib" pip install uwsgi
这样编译出来的uWSGI会优先绑定brew提供的高版本expat。
方案二:替换系统默认的libexpat(谨慎操作)
系统自带的expat版本偏低,我们可以通过软链接让系统优先使用brew的版本,但这个操作有一定风险,可能影响依赖旧版本expat的系统原生应用:
- 先备份系统原库:
sudo mv /usr/lib/libexpat.1.dylib /usr/lib/libexpat.1.dylib.bak
- 创建软链接指向brew的expat库:
sudo ln -s $(brew --prefix expat)/lib/libexpat.1.dylib /usr/lib/libexpat.1.dylib
⚠️ 划重点:如果之后发现其他程序出问题,直接把备份的文件移回去就能恢复:sudo mv /usr/lib/libexpat.1.dylib.bak /usr/lib/libexpat.1.dylib
方案三:用pyenv创建隔离环境(最稳妥)
如果不想碰系统级别的库,用pyenv搭建独立的Python环境是更安全的选择,所有依赖都在环境内部,不会干扰系统:
- 安装pyenv:
brew install pyenv - 配置pyenv到你的shell(根据你用的bash/zsh选择对应命令):
- bash用户:
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile - zsh用户:
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
- bash用户:
- 重启shell或者执行
source ~/.bash_profile(zsh用户则是source ~/.zshrc) - 安装一个适合Sierra的Python版本(比如3.8.18,是支持10.12的较新版本):
pyenv install 3.8.18 - 切换到这个环境:
pyenv local 3.8.18 - 最后安装uWSGI:
pip install uwsgi
内容的提问来源于stack exchange,提问作者Fabio
相关产品推荐
相关产品推荐

