Rye[1] 是 Flask 的作者 Armin Ronacher[2] 最近推出的一個實驗性質(zhì)的 Python 包管理系統(tǒng),目的是解決 Python 包管理目前面臨的工具鏈碎片化的問題。 大家知道,Python 目前的包管理系統(tǒng)很多,包括 poetry、pip、pipenv、pyenv、venv、virtualenv、pdm、hatch 等等,它們都是優(yōu)秀的工具,提出時都是解決了一定的問題,但沒有哪個工具能夠做到主流,因此也增加了系統(tǒng)的碎片化程度。 另一方面,conda 等工具能提供不同版本的 Python,管理不同的環(huán)境,但每個環(huán)境的 Python 不是共享的,環(huán)境創(chuàng)建一多,環(huán)境目錄就變得很大,且內(nèi)部機制很不透明,有時也會遇到?jīng)_突沒法解決的問題。 另一方面,Python 在 Linux/macOS 上的安裝也面臨一些問題,例如用包管理器安裝的 Python 和用戶手動安裝的 Python 有的時候會混淆,導致一些混亂,例如在 Fedora 上,用 pip install 安裝包可能會導致系統(tǒng)的包管理命令 dnf 出錯。PEP 668[3] 嘗試對這些問題給出一個解決方案,但也需要不同的系統(tǒng)來支持,目前看還任重道遠。 由于 Armin 也是一個 Rust 開發(fā)者,而 Rust 基于標準化的 rustup 和 cargo 兩個工具,配合配置文件來進行包管理,目前做的比較好,沒有 Python 面臨的碎片化問題。受 Rust 的啟發(fā),作者提出了 Rye,并且期望能夠啟發(fā) Python 社區(qū)提出類似 Rust 的標準包管理工具。 具體來說,Rye 提出了一些解決這些問題的思路:
但同時也有一個問題:rye 會不會是另一個做不到主流的 Python 包管理系統(tǒng),從而進一步增加 Python 包管理的碎片化呢?作者也有這個考慮,因此寫了一個討論帖 Should Rye Exist?[4] 來討論這個問題,同時關于 Rye 的設計初衷,可以參考這里[5]作者的思考。 個人觀點:Rye 的出現(xiàn)給 Python 社區(qū)引入了一些新鮮的解決現(xiàn)有問題的思路。使用 Rye 一段時間后,發(fā)現(xiàn)至少使用 standalone 的 Python 版本是一個解決沖突的好的方式。通過幾個簡單的命令來解決版本管理的問題是比較直觀的,提出 Rye 應該是利大于弊的,也就是有益程度大于碎片化增加的程度。 總之不管是 PEP-668 中標記版本管理是系統(tǒng)的還是 Python 的,還是 PEP 711[6] 來單獨下發(fā) Python 解釋器二進制文件,還是 Rye 的出現(xiàn),都是 Python 社區(qū)意識到 Python 包管理問題的嚴重性,進而做出的一些有益嘗試。期待在未來,有更標準化的工具,Python 的開發(fā)也更容易。 下面將對 Rye 的安裝和使用進行簡單介紹。 1.1 安裝 rustupRye 是基于 Rust 開發(fā)的,而 Rust 有標準的包安裝工具 cargo,Rust 編譯器和 cargo 都需要用 rustup 來安裝,因此安裝預編譯的 Rye 包需要先安裝 rustup: curl --proto '=https' --tlsv1.2 -sSf https://sh. | sh 執(zhí)行完后,重啟 Shell,輸入 cargo -V,如果不報錯,說明安裝成功。 1.2 安裝 Rye有了 cargo 后,使用下面的命令安裝 Rye:
通過命令行執(zhí)行 rye -h 來判斷 Rye 是否安裝成功。 同時可以將 $HOME/.rye/shims 添加到環(huán)境變量 PATH 中,這樣打開 Shell 后運行 python 就用的是 Rye 安裝到 standalone Python,否則你需要用 rye run python 來啟用 Rye 的 Python 解釋器。 更新 Rye 到最新版: rye self update 刪除 Rye:
1.3 初始化一個 Rye 項目使用 rye init project-name 來創(chuàng)建一個 Rye 項目目錄 rye init test_rye 輸出如下:
可以看到創(chuàng)建了. git 目錄, .gitignore 文件,README.md,配置文件 pyproject.toml 和一個示例的源碼文件 src/test_rye/__init__.py。 1.4 Python 版本管理為了固定開發(fā)環(huán)境,我們可以利用 rye pin python-version 來固定 Python 的版本,例如 rye pin cpython@3.10.11 會將 Python 版本固定為 3.10.11。 # cpython@可以省略 由于默認使用的 Python 版本是 Cpython 的,因此在執(zhí)行 rye 命令時可以將 Cpython@ 前綴省去。 注意 rye pin 命令并不立即改變 Python 的版本,只是修改配置文件. python-version,在 rye sync 執(zhí)行時才進行實際的修改。 可以多次執(zhí)行 rye pin 來調(diào)整 Python 的版本。 然后執(zhí)行 rye sync 來同步配置,具體來說,第一次執(zhí)行這個命令的時候,Rye 會下載一個單獨的 Python 解釋器,放置到 $HOME/.rye/py 目錄下,鏈接到項目的. venv 目錄下,因此同一個 Python 版本在磁盤上只有一份,這與 conda 是不同的。 更一般地,可以使用 rye toolchain 來查看、拉取和刪除 Python 版本。 rye toolchain list 用來顯示所有已經(jīng)安裝的 Python 版本:
輸出: cpython@3.11.3 (/Users/yunfeng/.rye/py/cpython@3.11.3/install/bin/python3) rye toolchain list --include-downloadable 會列出所有可以下載的 Python 版本:
輸出: cpython@3.10.8 (downloadable) 注意已經(jīng)下載的 Python 版本不在這個輸出中。 rye toolchain fetch(簡寫為 rye fetch) 可以直接拉取某個 Python 版本:
rye toolchain remove 可以刪除某個 Python 版本: rye toolchain remove 3.8.16 1.5 添加依賴包可以通過 rye add package-name 來安裝像 numpy 等第三方,這個命令支持安裝 GitHub 和本地的包,一些示例的用法如下:
同樣的,rye add 并不會實際安裝包,只會修改配置文件 pyproject.toml 中的 dependencies 項,等執(zhí)行 rye sync 的時候才真正安裝。 1.6 Rye 工作流我自己探索的 Rye 工作流大概是這樣:
需要注意的是,Rye 只負責依賴管理,具體的調(diào)試代碼工作,還需要自己來進行,使用你熟悉的代碼測試方式就可以了。 額外補充一下,可以使用 rye shell 來打開一個新的啟用了 Rye Python 的 Shell 來進行代碼調(diào)試。 1.7 安裝可執(zhí)行的 global Python 工具某些 python 包除了包含 Python 源碼外,還包含一些命令行工具,Rye 稱這些工具為 global tool ,因為它們不是在某個環(huán)境中才能使用,而是全局可使用的。這些工具可以用 rye install package-name 來安裝,例如: rye install black 使用方式為 rye run tool-name:
這些包都存放在 $HOME/.rye/shims 目錄下。如果要刪除 global tool,可以使用 rye uninstall: rye uninstall black 參考資料Rye: https://mitsuhiko./rye [2]Armin Ronacher: https://github.com/mitsuhiko [3]PEP 668: https://peps./pep-0668 [4]Should Rye Exist?: https://github.com/mitsuhiko/rye/discussions/6 [5]這里: https://mitsuhiko./rye/philosophy [6]PEP 711: https://peps./pep-0711 - EOF - |
|
來自: hercules028 > 《Python and AI》