【uwsgi】Mac下python dyld :Library not loaded 问题解决

今天在Mac下使用uwsgi运行Python Flask的web程序时遇到了dyld: Library not loaded问题,记录一下解决方法

问题

今天本来想使用uwsgi在本地运行一下之前编写的flask程序,以便部署到服务器,结果遇到了一个比较坑的问题。

本来我的Mac没有安装uwsgi,使用如下命令安装了uwsgi

1
pip3 install uwsgi

我的电脑上有Python2 和 Python3 两个环境,pip对应Python2 ,pip3 对应 Python3

安装了之后,运行flask官方文档的uwsgi的运行命令,结果遇到了如下问题

1
2
3
4
5
dongxiyan@MacBook-Pro ~ % uwsgi -s /tmp/app.sock --manage-script-name --mount /app=app:app
dyld: Library not loaded: @rpath/Python3.framework/Versions/3.8/Python3
Referenced from: /Users/dongxiyan/Library/Python/3.8/bin/uwsgi
Reason: image not found
zsh: abort uwsgi

报了dyld: Library not loaded这个错,uwsgi运行不起来

解决步骤

经过一通google、百度,发现原因是在运行uwsgi时找不到了Python3的动态库,即该路径@rpath/Python3.framework/Versions/3.8/Python3不存在。

不应该啊,我记得我的电脑装了Python3的,猜想是不是Python2和Python3乱了环境,uwsgi去找了Python2的库,查看Python2和Python3的具体路径

1
2
3
4
5
6
7
8
9
10
11
12
dongxiyan@MacBook-Pro ~ % which /usr/bin/python
/usr/bin/python
dongxiyan@MacBook-Pro ~ % otool -L /usr/bin/python
/usr/bin/python:
/System/Library/Frameworks/Python.framework/Versions/2.7/Python (compatibility version 2.7.0, current version 2.7.16)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1292.60.1)
dongxiyan@MacBook-Pro ~ % which /usr/bin/python3
/usr/bin/python3
dongxiyan@MacBook-Pro ~ % otool -L /usr/bin/python3
/usr/bin/python3:
/usr/lib/libxcselect.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1292.60.1)

otool -L /usr/bin/python 查看/usr/bin/python 的依赖
otool Mac 下的反编译工具

看到Python2 和 Python3 的依赖不一样,Python2下有依赖/System/Library/Frameworks/Python.framework/Versions/2.7/Python,按理说Python3也应该依赖/System/Library/Frameworks/Python.framework/Versions/3.8/Python,但是查出来的依赖里没有,查看/System/Library/Frameworks/Python.framework/Versions/路径下的文件,没有Python3的

1
2
dongxiyan@MacBook-Pro ~ % ls /System/Library/Frameworks/Python.framework/Versions/
2.3 2.5 2.6 2.7 Current

但是我在命令行下运行Python3是没问题的,说明Python3的库不在这个目录下/System/Library/Frameworks/Python.framework/Versions//usr/bin/python3的依赖应该也没有问题,因为python3能成功运行

1
2
3
4
5
dongxiyan@MacBook-Pro ~ % python3
Python 3.8.2 (default, Dec 21 2020, 15:06:04)
[Clang 12.0.0 (clang-1200.0.32.29)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

应该不是乱环境了,如果是乱环境了,应该是报dyld: Library not loaded: @rpath/Python.framework/Versions/2.7/Python这个错才对,估计原因是/System/Library/Frameworks/Python3.framework/Versions/3.8/Python3 这个的路径不存在,查一下,果然不存在

【uwsgi】Mac下python dyld :Library not loaded 问题解决

但为什么会不存在的呢?我的Python3在本地运行时没问题的啊,那应该就是Python3的运行路径不在上面那个路径下,这个路径要怎样设置才正确呢?

然后继续谷歌百度@rpath/Python3.framework/Versions/3.8/Python3相关内容,查到@rpath的意思是可执行程序内部设置的一组路径,那解决办法就是把我的本地Python3的路径添加到@rpath 下应该就行了,根据Python2的依赖,估计@rpath 指的就是/System/Library/Frameworks。

先找到本地Python3的运行路径,命令行下import sys sys.path

【uwsgi】Mac下python dyld :Library not loaded 问题解决

可以看到本地Python3的路径为/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8,原来使用的是Xcode的Python3环境,那把这个路径加到@rpath 下问题应该就解决了。

但是经过一通谷歌百度,也没找到@rpath 的添加方法,不过找到了修改uwsgi动态库依赖的方法,查看uwsgi的依赖

1
2
3
4
5
6
7
8
dongxiyan@MacBook-Pro ~ % otool -L /Users/dongxiyan/Library/Python/3.8/bin/uwsgi
/Users/dongxiyan/Library/Python/3.8/bin/uwsgi:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1292.60.1)
/usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.11)
/usr/local/opt/pcre/lib/libpcre.1.dylib (compatibility version 4.0.0, current version 4.12.0)
/usr/lib/libexpat.1.dylib (compatibility version 7.0.0, current version 8.0.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1770.255.0)
@rpath/Python3.framework/Versions/3.8/Python3 (compatibility version 3.8.0, current version 3.8.0)

只要把@rpath/Python3.framework/Versions/3.8/Python3改成正确的路径应该就行了,在这里把它换成Xcode的Python3路径

修改命令如下

1
install_name_tool -change @rpath/Python3.framework/Versions/3.8/Python3 /Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.8/Python /Users/dongxiyan/Library/Python/3.8/bin/uwsgi

工具install_name_tool可以用来修改应用程序对动态库的查找路径

修改完成后运行uwsgi命令,成功运行,问题解决。

【uwsgi】Mac下python dyld :Library not loaded 问题解决

总结

这个问题真的好坑,折腾了我一下午,刚开始查到网上说的解决方案是使用brew升级一下Python3就可以,但是我并没有使用brew安装Python3,显然这个方案解决不了我这个问题,最终经过一番查抄,问题的根源就是Python3的动态库没找到,把Python3的动态库链接改为正确的路径就可以。

但是感觉修改uwsgi的动态库链接治标不治本,如果哪一天又安装了一个库,它也使用了@rpath ,这个错估计又要报出来了。

其他库报这个错时也可以用这个方法解决,不过这个错误正确的解决方法应该就是把本地Python3的路径加到@rpath 下,但目前还未找到如何添加,后面再研究一下吧,至少目前的问题解决了。

参考

修复 dyld: Library not loaded

install_name_tool解决dyld: Library not loaded

mac加载路径@rpath

MacOS平台下@rpath在动态链接库中的应用

MAC: @rpath的坑

python3错误

https://www.cnblogs.com/yrxns/p/11208861.html

上一篇:11月27日总结


下一篇:Centos下虚拟环境的创建以及python3安装