一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Rye:一個實驗性質(zhì)的 Python 包管理系統(tǒng)

 hercules028 2023-06-03 發(fā)布于四川
作者:YunfengWang
來源:https://vra./2023/05/17/rye-intro

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 提出了一些解決這些問題的思路:

  • 提出一個 workspace 的概念,workspace 類似一個項目目錄,或者一個 git 倉庫,一個 workspace 下只有一個 Python 版本,不同 workspace Python 版本相互隔離,每個項目采用 pyproject.toml 來進行配置
  • 不使用系統(tǒng)自帶的 Python,相反地,在每個項目目錄的中下載一個 standalone 的 python,解決不同版本的沖突問題 + 不暴露 pip 命令,通過 rye add + rye sync 來管理包的依賴,避免包 A 和包 B 依賴不同版本的包 C 而導致的不兼容問題
  • 區(qū)分開發(fā)環(huán)境和正式環(huán)境,因為一些包在開發(fā)時會用到一些調(diào)試工具,但作為第三方庫被引入的時候并不需要
  • 支持 import 本地 workspace 作為第三方庫包

但同時也有一個問題: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 安裝 rustup

Rye 是基于 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:

cargo install --git https://github.com/mitsuhiko/rye 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:

cargo uninstall rye

1.3 初始化一個 Rye 項目

使用 rye init project-name 來創(chuàng)建一個 Rye 項目目錄

rye init test_rye
cd test_rye
tree

輸出如下:

├── .git
├── .gitignore
├── .python-version
├── README.md
├── pyproject.toml
└── src
    └── test_rye
        └── __init__.py

可以看到創(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@可以省略
rye pin cpython@3.10.11
rye pin 3.10.11

由于默認使用的 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 版本:

rye toolcahin list

輸出:

cpython@3.11.3 (/Users/yunfeng/.rye/py/cpython@3.11.3/install/bin/python3)
cpython@3.11.1 (/Users/yunfeng/.rye/py/cpython@3.11.1/install/bin/python3)
cpython@3.10.11 (/Users/yunfeng/.rye/py/cpython@3.10.11/install/bin/python3)
cpython@3.10.9 (/Users/yunfeng/.rye/py/cpython@3.10.9/install/bin/python3)

rye toolchain list --include-downloadable 會列出所有可以下載的 Python 版本:

rye toolchain list --include-downloadable

輸出:

cpython@3.10.8 (downloadable)
cpython@3.10.7 (downloadable)
cpython@3.10.6 (downloadable)
cpython@3.10.5 (downloadable)
cpython@3.10.4 (downloadable)
cpython@3.10.3 (downloadable)
cpython@3.10.2 (downloadable)
cpython@3.10.0 (downloadable)
...

注意已經(jīng)下載的 Python 版本不在這個輸出中。

rye toolchain fetch(簡寫為 rye fetch) 可以直接拉取某個 Python 版本:

rye toolchain fetch 3.8.16

rye toolchain remove 可以刪除某個 Python 版本:

rye toolchain remove 3.8.16

1.5 添加依賴包

可以通過 rye add package-name 來安裝像 numpy 等第三方,這個命令支持安裝 GitHub 和本地的包,一些示例的用法如下:

rye add numpy
# 同時安裝幾個包
rye add six easydict
# 設置安裝包的版本
rye add 'Flask>=2.0'
# 只在development環(huán)境添加包
rye add --dev black
# 添加github上的包
rye add Flask --git=https://github.com/pallets/flask
# 添加本地目錄的包
rye add My-Utility --path ./my-utility

同樣的,rye add 并不會實際安裝包,只會修改配置文件 pyproject.toml 中的 dependencies 項,等執(zhí)行 rye sync 的時候才真正安裝。

1.6 Rye 工作流

我自己探索的 Rye 工作流大概是這樣:

  1. rye init project-name 來初始化項目目錄

  2. git add 和 git commit 來提交初始狀態(tài)的代碼,方便定位后續(xù)代碼和配置文件的更新

  3. rye pin 指定 Python 版本

  4. 修改代碼,rye add package-name 來增加代碼依賴的包

  5. rye sync 來安裝 Python,安裝依賴包,更新配置文件

  6. rye run python 執(zhí)行代碼測試

  7. 可選:rye build 來生成可發(fā)布的 wheel 文件

  8. 可選:rye publish 上傳包到 pypi

需要注意的是,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:

rye run black -h

這些包都存放在 $HOME/.rye/shims 目錄下。如果要刪除 global tool,可以使用 rye uninstall:

rye uninstall black

參考資料

[1]

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 -

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    东京热男人的天堂久久综合| 国产一区欧美一区日本道| 久久热中文字幕在线视频| 国产亚州欧美一区二区| 日本三区不卡高清更新二区| 69久久精品亚洲一区二区| 久久亚洲午夜精品毛片| 太香蕉久久国产精品视频| 国产精品日本女优在线观看| 亚洲综合天堂一二三区| 久久碰国产一区二区三区| 欧美日韩三区在线观看| 精品人妻一区二区三区在线看| 日本不卡视频在线观看| 精品综合欧美一区二区三区| 欧美日韩国产综合在线| 欧美午夜色视频国产精品| 九九热精彩视频在线播放| 99久久免费看国产精品| 久久精品中文字幕人妻中文| 国产精品一区二区成人在线| 91人妻人人做人碰人人九色| 天海翼精品久久中文字幕| 国产精品尹人香蕉综合网| 毛片在线观看免费日韩| 欧美激情一区二区亚洲专区| 精产国品一二三区麻豆| 人妻人妻人人妻人人澡| 真实国产乱子伦对白视频不卡| 亚洲欧美日本成人在线| 亚洲欧洲精品一区二区三区| 国产精品一区二区三区欧美 | 国产内射一级一片内射高清| 日本一级特黄大片国产| 日本视频在线观看不卡| 欧美高潮喷吹一区二区| 日韩欧美在线看一卡一卡| 99久只有精品免费视频播放| 国产毛片不卡视频在线| 人妻少妇久久中文字幕久久| 亚洲三级视频在线观看免费|