【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 這個的路徑不存在,查一下,果然不存在

python

但為什么會不存在的呢?我的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
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命令,成功運行,問題解決。

總結

這個問題真的好坑,折騰了我一下午,剛開始查到網上說的解決方案是使用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM