Rye: Armin Ronacher 的 Python 项目管理工具¶
为什么要学 Rye¶
Python 的工具链一直被诟病"碎片化":安装 Python 要 pyenv,管理虚拟环境要 venv/virtualenv,管理依赖要 pip/pip-tools/Poetry/PDM,打包要 setuptools/flit/hatch……每个工具管一件事,但缺少一个"把它们统一起来"的方案。
Rye 由 Armin Ronacher(Flask/Jinja2/Click 的作者)创建,目标是做 Python 的一站式项目管理工具:从安装 Python 本身到管理依赖、构建发布,一个工具搞定。
| 功能 | 传统方式 | Rye |
|---|---|---|
| 安装 Python | pyenv / 系统包管理器 | rye fetch 3.12 |
| 创建项目 | 手动 init + pyproject.toml | rye init |
| 管理依赖 | pip freeze / pip-tools / Poetry | rye add / rye sync |
| 虚拟环境 | python -m venv / virtualenv | 自动管理 |
| 锁定依赖 | pip-compile / poetry lock | rye lock |
| 运行脚本 | 手动激活 venv + python | rye run |
| 构建发布 | setuptools / build / twine | rye build / rye publish |
重要说明:Rye 已合入 uv¶
2024 年,Rye 的理念被 Astral 团队(Ruff 的开发者)采纳,核心功能整合进了 uv。Armin Ronacher 本人推荐新项目使用 uv。本教程仍然覆盖 Rye,因为: - 许多现有项目仍在使用 Rye - Rye 的工作流概念是理解 uv 的基础 - 两者的命令和概念高度相似
核心概念¶
白话解释¶
Rye 统一了 Python 项目的全生命周期:
rye init → 创建项目
rye pin 3.12 → 指定 Python 版本(Rye 自动下载)
rye add flask → 添加依赖
rye sync → 安装所有依赖到虚拟环境
rye run app → 在虚拟环境中运行
rye build → 构建包
rye publish → 发布到 PyPI
你不需要手动管理 Python 版本、虚拟环境、锁文件——Rye 处理一切。
核心概念表¶
| 概念 | 说明 | 传统等价物 |
|---|---|---|
pyproject.toml | 项目配置和依赖定义 | requirements.txt + setup.py |
requirements.lock | 锁定的完整依赖树 | pip-compile 输出 |
requirements-dev.lock | 开发依赖的锁文件 | dev-requirements.txt |
.python-version | 项目的 Python 版本 | pyenv local |
rye sync | 安装/同步依赖 | pip install + virtualenv |
rye add | 添加依赖 | 手动编辑 requirements.txt |
rye run | 在项目环境中执行命令 | source venv/bin/activate + cmd |
| Workspace | 多包工作空间 | monorepo |
| Toolchain | 管理 Python 安装 | pyenv |
项目结构¶
my-project/
├── pyproject.toml # 项目配置(核心文件)
├── requirements.lock # 生产依赖锁文件
├── requirements-dev.lock # 开发依赖锁文件
├── .python-version # Python 版本(如 3.12.0)
├── .venv/ # 虚拟环境(自动管理)
├── src/
│ └── my_project/
│ ├── __init__.py
│ └── main.py
└── tests/
└── test_main.py
安装配置¶
安装 Rye¶
macOS/Linux
curl -sSf https://rye.astral.sh/get | bash
# 按提示将 Rye 添加到 PATH
echo 'source "$HOME/.rye/env"' >> ~/.bashrc
# 或 Fish:
# echo 'source "$HOME/.rye/env.fish"' >> ~/.config/fish/config.fish
Windows
配置¶
# 初始配置
rye config --set-bool behavior.global-python=true # Rye 管理的 Python 作为全局默认
rye config --set-bool behavior.use-uv=true # 使用 uv 作为安装器(更快)
全局配置文件位于 ~/.rye/config.toml:
[behavior]
global-python = true
use-uv = true
[default]
toolchain = "cpython@3.12"
build-system = "hatchling"
安装 Python¶
# 列出可用的 Python 版本
rye toolchain list --include-downloadable
# 安装特定版本
rye toolchain fetch 3.12
rye toolchain fetch 3.11
# 查看已安装的 Python
rye toolchain list
快速上手¶
创建新项目¶
# 自动生成的 pyproject.toml
[project]
name = "my-project"
version = "0.1.0"
description = "Add your description here"
dependencies = []
readme = "README.md"
requires-python = ">= 3.11"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.backends"
管理依赖¶
# 添加生产依赖
rye add flask
rye add sqlalchemy
rye add "pydantic>=2.0"
# 添加开发依赖
rye add --dev pytest
rye add --dev ruff
rye add --dev mypy
# 同步(安装所有依赖)
rye sync
# 移除依赖
rye remove flask
指定 Python 版本¶
# 设置项目 Python 版本
rye pin 3.12
# Rye 自动:
# 1. 下载 Python 3.12(如果没有)
# 2. 创建使用 3.12 的虚拟环境
# 3. 更新 .python-version 文件
运行代码¶
# 在项目环境中运行
rye run python src/my_project/main.py
# 运行已安装的命令行工具
rye run pytest
rye run ruff check .
rye run mypy src/
# 进入项目的 Python Shell
rye run python
脚本定义¶
# pyproject.toml
[project.scripts]
serve = "my_project.main:main"
[tool.rye.scripts]
dev = "flask run --debug"
test = "pytest -v"
lint = { chain = ["ruff check .", "mypy src/"] }
format = "ruff format ."
rye run serve # 运行 project.scripts 定义的入口
rye run dev # 运行 tool.rye.scripts 定义的命令
rye run test # 运行测试
rye run lint # 链式执行 ruff + mypy
进阶用法¶
全局工具安装¶
# 安装全局可用的工具(不依赖项目)
rye install ruff
rye install black
rye install httpie
rye install poetry # 甚至可以安装其他包管理器
# 列出全局安装的工具
rye tools list
# 卸载全局工具
rye uninstall httpie
Workspace(多包项目)¶
# 根目录 pyproject.toml
[tool.rye.workspace]
members = ["packages/*"]
# 目录结构
my-workspace/
├── pyproject.toml # workspace 根配置
├── packages/
│ ├── core/
│ │ ├── pyproject.toml
│ │ └── src/core/
│ ├── api/
│ │ ├── pyproject.toml
│ │ └── src/api/
│ └── cli/
│ ├── pyproject.toml
│ └── src/cli/
锁文件管理¶
# 生成/更新锁文件
rye lock
# 锁文件应该提交到 Git
# requirements.lock — 生产依赖
# requirements-dev.lock — 开发依赖
# 从锁文件安装(确定性安装)
rye sync
构建和发布¶
# 构建
rye build
# 输出: dist/my_project-0.1.0-py3-none-any.whl
# 输出: dist/my_project-0.1.0.tar.gz
# 发布到 PyPI
rye publish
# 发布到私有仓库
rye publish --repository-url https://private.pypi.org/simple/
从其他工具迁移¶
从 Poetry 迁移
# Rye 可以读取 Poetry 风格的 pyproject.toml
cd existing-poetry-project
rye sync # Rye 自动识别依赖
# 然后用 rye 管理后续操作
从 requirements.txt 迁移
# 初始化 Rye 项目
rye init my-project --no-pin
cd my-project
# 从 requirements.txt 导入
cat ../requirements.txt | xargs rye add
# 同步
rye sync
与 uv 的关系¶
# Rye 可以使用 uv 作为底层安装器(更快)
rye config --set-bool behavior.use-uv=true
# uv 的等价命令
# rye init → uv init
# rye add → uv add
# rye sync → uv sync
# rye run → uv run
# rye lock → uv lock
# rye build → uv build
# rye publish → uv publish
迁移到 uv 非常简单,因为两者共享 pyproject.toml 格式和大部分命令语义。
常见问题¶
Q1: Rye 和 uv 我该用哪个?¶
- 新项目:推荐 uv(Rye 的精神继承者,性能更好,生态更活跃)
- 已有 Rye 项目:可以继续用 Rye,也可以平滑迁移到 uv
- 想学概念:学 Rye 的工作流,很容易迁移到 uv
Q2: Rye 和 Poetry 的区别?¶
| 功能 | Rye | Poetry |
|---|---|---|
| Python 版本管理 | 内置 | 需要 pyenv |
| 安装速度 | 快(用 uv) | 较慢 |
| 锁文件格式 | requirements.lock (pip 兼容) | poetry.lock (私有格式) |
| 全局工具安装 | 支持 | 不支持 |
| Workspace | 支持 | 支持(有限) |
Q3: 虚拟环境在哪里?¶
# Rye 自动在项目目录下创建 .venv
ls -la .venv/
# 大多数 IDE 会自动检测 .venv
# VS Code: 设置 Python Interpreter 指向 .venv/bin/python
Q4: 如何指定 pip 源?¶
# pyproject.toml
[[tool.rye.sources]]
name = "tuna"
url = "https://pypi.tuna.tsinghua.edu.cn/simple/"
Q5: 可以在没有 Rye 的环境中使用 requirements.lock 吗?¶
可以。requirements.lock 是标准的 pip 格式:
这是 Rye 相对于 Poetry 的一个优势——锁文件不需要特殊工具就能使用。
参考资源¶
| 资源 | 链接 |
|---|---|
| Rye 官方文档 | https://rye.astral.sh |
| Rye GitHub | https://github.com/astral-sh/rye |
| uv(Rye 的继任者) | https://docs.astral.sh/uv |
| Armin Ronacher 的博客 | https://lucumr.pocoo.org |
| pyproject.toml 规范 | https://packaging.python.org/en/latest/specifications/pyproject-toml/ |
| Astral(Ruff/uv 公司) | https://astral.sh |
总结:Rye 代表了 Python 项目管理的正确方向——一个工具管理所有事情。虽然它的精神和功能已经由 uv 继承,但 Rye 的概念和工作流仍然是理解现代 Python 项目管理的最佳入口。如果你还在用 pip + virtualenv + pyenv 的组合,Rye/uv 会让你体验到"这才是 2024 年 Python 该有的样子"。