可以使用pyenv安裝並在多個 Python 版本之間切換,這在嘗試開發和測試針對不僅僅是最新版本的 Python 的軟體時非常有用。這些Python安裝的依賴項之一是readline,它是由brew安裝的。
我發現的問題是,brew 會定期自行安裝新版本的 readline。儘管系統上可能存在多個版本的 readline,但只有其中一個版本在 /usr/local/opt/readline 處進行符號連結。
如果brew升級到新版本的readline,Python會突然開始吐出文本,就像^[[A
嘗試使用遊標鍵進行行編輯時一樣。如果您隨後嘗試明確顯示,import readline
您將看到以下錯誤:
>>> import readline
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: dlopen(/Users/********/.pyenv/versions/3.7.0/lib/python3.7/lib-dynload/readline.cpython-37m-darwin.so, 2): Library not loaded: /usr/local/opt/readline/lib/libreadline.7.dylib
Referenced from: /Users/********/.pyenv/versions/3.7.0/lib/python3.7/lib-dynload/readline.cpython-37m-darwin.so
Reason: image not found
它正在尋找/usr/local/opt/readline/lib/libreadline.7.dylib
。問題似乎是在pyenv install
建立 Python 時,/usr/local/opt/readline
是一個/usr/local/Cellar/readline/7.0.5
包含lib/libreadline.7.dylib
.該文件仍然存在!但此路徑不再可用,因為brew 已更新符號連結以指向版本 8。
我可以brew switch readline 7.0.5
再次交換這些,然後 pyenv 的 Python 將再次工作。但現在自製的Python 也以同樣的方式被破壞。有沒有什麼明智的方法可以讓這些共存並且不會再次自發性斷裂下次 Homebrew 安裝新版的 readline 時?
答案1
我在資料夾中沒有找到 readline 7 /usr/local/opt/readline/lib/
,但我只找到了libreadline.8.0.dylib
.我用這個解決方案解決了這個問題。
基本上,您只需要建立一個軟連結:
sudo ln -s libreadline.8.0.dylib libreadline.7.dylib