今天在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 |
dongxiyan@MacBook-Pro ~ % uwsgi -s /tmp/app.sock --manage-script-name --mount /app=app:app |
报了dyld: Library not loaded
这个错,uwsgi运行不起来
解决步骤
经过一通google、百度,发现原因是在运行uwsgi时找不到了Python3的动态库,即该路径@rpath/Python3.framework/Versions/3.8/Python3
不存在。
不应该啊,我记得我的电脑装了Python3的,猜想是不是Python2和Python3乱了环境,uwsgi去找了Python2的库,查看Python2和Python3的具体路径
1 |
dongxiyan@MacBook-Pro ~ % which /usr/bin/python |
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 |
dongxiyan@MacBook-Pro ~ % ls /System/Library/Frameworks/Python.framework/Versions/ |
但是我在命令行下运行Python3是没问题的,说明Python3的库不在这个目录下/System/Library/Frameworks/Python.framework/Versions/
,/usr/bin/python3
的依赖应该也没有问题,因为python3
能成功运行
1 |
dongxiyan@MacBook-Pro ~ % python3 |
应该不是乱环境了,如果是乱环境了,应该是报dyld: Library not loaded: @rpath/Python.framework/Versions/2.7/Python
这个错才对,估计原因是/System/Library/Frameworks/Python3.framework/Versions/3.8/Python3
这个的路径不存在,查一下,果然不存在
但为什么会不存在的呢?我的Python3在本地运行时没问题的啊,那应该就是Python3的运行路径不在上面那个路径下,这个路径要怎样设置才正确呢?
然后继续谷歌百度@rpath/Python3.framework/Versions/3.8/Python3
相关内容,查到@rpath
的意思是可执行程序内部设置的一组路径,那解决办法就是把我的本地Python3的路径添加到@rpath
下应该就行了,根据Python2的依赖,估计@rpath
指的就是/System/Library/Frameworks。
先找到本地Python3的运行路径,命令行下import sys sys.path
可以看到本地Python3的路径为/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8
,原来使用的是Xcode的Python3环境,那把这个路径加到@rpath
下问题应该就解决了。
但是经过一通谷歌百度,也没找到@rpath
的添加方法,不过找到了修改uwsgi
动态库依赖的方法,查看uwsgi
的依赖
1 |
dongxiyan@MacBook-Pro ~ % otool -L /Users/dongxiyan/Library/Python/3.8/bin/uwsgi |
只要把@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命令,成功运行,问题解决。
总结
这个问题真的好坑,折腾了我一下午,刚开始查到网上说的解决方案是使用brew升级一下Python3就可以,但是我并没有使用brew安装Python3,显然这个方案解决不了我这个问题,最终经过一番查抄,问题的根源就是Python3的动态库没找到,把Python3的动态库链接改为正确的路径就可以。
但是感觉修改uwsgi
的动态库链接治标不治本,如果哪一天又安装了一个库,它也使用了@rpath
,这个错估计又要报出来了。
其他库报这个错时也可以用这个方法解决,不过这个错误正确的解决方法应该就是把本地Python3的路径加到@rpath
下,但目前还未找到如何添加,后面再研究一下吧,至少目前的问题解决了。
参考
install_name_tool解决dyld: Library not loaded
https://www.cnblogs.com/yrxns/p/11208861.html