今天在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 的依賴otoolMac 下的反編譯工具
看到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 下,但目前還未找到如何添加,后面再研究一下吧,至少目前的問題解決了。
