Rye:一个实验性质的Python包管理系统,Flask 作者推出

2023-05-3113:10:31后端程序开发Comments919 views字数 4160阅读模式
Rye:一个实验性质的Python包管理系统,Flask 作者推出

作者:YunfengWang 来源:https://vra.github.io/2023/05/17/rye-intro文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

Rye[1] 是 Flask 的作者 Armin Ronacher[2] 最近推出的一个实验性质的 Python 包管理系统,目的是解决 Python 包管理目前面临的工具链碎片化的问题。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

大家知道,Python 目前的包管理系统很多,包括 poetry、pip、pipenv、pyenv、venv、virtualenv、pdm、hatch 等等,它们都是优秀的工具,提出时都是解决了一定的问题,但没有哪个工具能够做到主流,因此也增加了系统的碎片化程度。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

另一方面,conda 等工具能提供不同版本的 Python,管理不同的环境,但每个环境的 Python 不是共享的,环境创建一多,环境目录就变得很大,且内部机制很不透明,有时也会遇到冲突没法解决的问题。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

另一方面,Python 在 Linux/macOS 上的安装也面临一些问题,例如用包管理器安装的 Python 和用户手动安装的 Python 有的时候会混淆,导致一些混乱,例如在 Fedora 上,用 pip install 安装包可能会导致系统的包管理命令 dnf 出错。PEP 668[3] 尝试对这些问题给出一个解决方案,但也需要不同的系统来支持,目前看还任重道远。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

由于 Armin 也是一个 Rust 开发者,而 Rust 基于标准化的 rustup 和 cargo 两个工具,配合配置文件来进行包管理,目前做的比较好,没有 Python 面临的碎片化问题。受 Rust 的启发,作者提出了 Rye,并且期望能够启发 Python 社区提出类似 Rust 的标准包管理工具。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

具体来说,Rye 提出了一些解决这些问题的思路:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

  • 提出一个 workspace 的概念,workspace 类似一个项目目录,或者一个 git 仓库,一个 workspace 下只有一个 Python 版本,不同 workspace Python 版本相互隔离,每个项目采用 来进行配置
  • 不使用系统自带的 Python,相反地,在每个项目目录的中下载一个 standalone 的 python,解决不同版本的冲突问题 + 不暴露 pip 命令,通过 rye add + rye sync 来管理包的依赖,避免包 A 和包 B 依赖不同版本的包 C 而导致的不兼容问题
  • 区分开发环境和正式环境,因为一些包在开发时会用到一些调试工具,但作为第三方库被引入的时候并不需要
  • 支持 import 本地 workspace 作为第三方库包

但同时也有一个问题:rye 会不会是另一个做不到主流的 Python 包管理系统,从而进一步增加 Python 包管理的碎片化呢?作者也有这个考虑,因此写了一个讨论帖 Should Rye Exist?[4] 来讨论这个问题,同时关于 Rye 的设计初衷,可以参考这里[5]作者的思考。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

个人观点:Rye 的出现给 Python 社区引入了一些新鲜的解决现有问题的思路。使用 Rye 一段时间后,发现至少使用 standalone 的 Python 版本是一个解决冲突的好的方式。通过几个简单的命令来解决版本管理的问题是比较直观的,提出 Rye 应该是利大于弊的,也就是有益程度大于碎片化增加的程度。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

总之不管是 PEP-668 中标记版本管理是系统的还是 Python 的,还是 PEP 711[6] 来单独下发 Python 解释器二进制文件,还是 Rye 的出现,都是 Python 社区意识到 Python 包管理问题的严重性,进而做出的一些有益尝试。期待在未来,有更标准化的工具,Python 的开发也更容易。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

下面将对 Rye 的安装和使用进行简单介绍。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

安装 rustup文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

Rye 是基于 Rust 开发的,而 Rust 有标准的包安装工具 cargo,Rust 编译器和 cargo 都需要用 rustup 来安装,因此安装预编译的 Rye 包需要先安装 rustup:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

curl --proto '=https' --tlsv -sSf https://sh.rustup.rs | sh
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

执行完后,重启 Shell,输入 cargo -V,如果不报错,说明安装成功。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

安装 Rye文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

有了 cargo 后,使用下面的命令安装 Rye:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

cargo install --git /rye rye
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

通过命令行执行 rye -h 来判断 Rye 是否安装成功。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

同时可以将 $HOME/.rye/shims 添加到环境变量 PATH 中,这样打开 Shell 后运行 python 就用的是 Rye 安装到 standalone Python,否则你需要用 rye run python 来启用 Rye 的 Python 解释器。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

更新 Rye 到最新版:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

rye self update
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

删除 Rye:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

cargo uninstall rye
1.3 初始化一个 Rye 项目文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

使用 rye init project-name 来创建一个 Rye 项目目录文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

rye init test_rye
cd test_rye
tree
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

输出如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

├── .git
├── .gitignore
├── .python-version
├──
├──
└── src
└── test_rye
└──
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

可以看到创建了. git 目录, .gitignore 文件,,配置文件 和一个示例的源码文件 src/test_rye/。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

1.4 Python 版本管理文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

为了固定开发环境,我们可以利用 rye pin python-version 来固定 Python 的版本,例如 rye pin cpython@ 会将 Python 版本固定为 。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

# cpython@可以省略
rye pin cpython@
rye pin
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

由于默认使用的 Python 版本是 Cpython 的,因此在执行 rye 命令时可以将 Cpython@ 前缀省去。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

注意 rye pin 命令并不立即改变 Python 的版本,只是修改配置文件. python-version,在 rye sync 执行时才进行实际的修改。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

可以多次执行 rye pin 来调整 Python 的版本。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

然后执行 rye sync 来同步配置,具体来说,第一次执行这个命令的时候,Rye 会下载一个单独的 Python 解释器,放置到 $HOME/.rye/py 目录下,链接到项目的. venv 目录下,因此同一个 Python 版本在磁盘上只有一份,这与 conda 是不同的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

更一般地,可以使用 rye toolchain 来查看、拉取和删除 Python 版本。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

rye toolchain list 用来显示所有已经安装的 Python 版本:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

rye toolcahin list
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

输出:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

cpython@ (/Users/yunfeng/.rye/py/cpython@/install/bin/python3)
cpython@3.1 (/Users/yunfeng/.rye/py/cpython@3.1/install/bin/python3)
cpython@ (/Users/yunfeng/.rye/py/cpython@/install/bin/python3)
cpython@ (/Users/yunfeng/.rye/py/cpython@/install/bin/python3)
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

rye toolchain list --include-downloadable 会列出所有可以下载的 Python 版本:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

rye toolchain list --include-downloadable
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

输出:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

cpython@ (downloadable)
cpython@ (downloadable)
cpython@ (downloadable)
cpython@ (downloadable)
cpython@ (downloadable)
cpython@ (downloadable)
cpython@ (downloadable)
cpython@ (downloadable)
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

注意已经下载的 Python 版本不在这个输出中。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

rye toolchain fetch(简写为 rye fetch) 可以直接拉取某个 Python 版本:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

rye toolchain fetch 3.8.16
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

rye toolchain remove 可以删除某个 Python 版本:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

rye toolchain remove 3.8.16
1.5 添加依赖包文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

可以通过 rye add package-name 来安装像 numpy 等第三方,这个命令支持安装 GitHub 和本地的包,一些示例的用法如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

rye add numpy
# 同时安装几个包
rye add six easydict
# 设置安装包的版本
rye add "Flask>="
# 只在development环境添加包
rye add --dev black
# 添加github上的包
rye add Flask --git=https://github.com/pallets/flask
# 添加本地目录的包
rye add My-Utility --path ./my-utility
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

同样的,rye add 并不会实际安装包,只会修改配置文件 中的 dependencies 项,等执行 rye sync 的时候才真正安装。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

1.6 Rye 工作流文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

我自己探索的 Rye 工作流大概是这样:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

  1. rye init project-name 来初始化项目目录
  2. git add 和 git commit 来提交初始状态的代码,方便定位后续代码和配置文件的更新
  3. rye pin 指定 Python 版本
  4. 修改代码,rye add package-name 来增加代码依赖的包
  5. rye sync 来安装 Python,安装依赖包,更新配置文件
  6. rye run python 执行代码测试
  7. 可选:rye build 来生成可发布的 wheel 文件
  8. 可选:rye publish 上传包到 pypi

需要注意的是,Rye 只负责依赖管理,具体的调试代码工作,还需要自己来进行,使用你熟悉的代码测试方式就可以了。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

额外补充一下,可以使用 rye shell 来打开一个新的启用了 Rye Python 的 Shell 来进行代码调试。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

安装可执行的 global Python 工具文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

某些 python 包除了包含 Python 源码外,还包含一些命令行工具,Rye 称这些工具为 global tool ,因为它们不是在某个环境中才能使用,而是全局可使用的。这些工具可以用 rye install package-name 来安装,例如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

rye install black
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

使用方式为 rye run tool-name:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

rye run black -h
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

这些包都存放在 $HOME/.rye/shims 目录下。如果要删除 global tool,可以使用 rye uninstall:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

rye uninstall black文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/43757.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/43757.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定