python 包管理一站式解决方案: rye, 相对于其他包管理工具如pyenv, poetry等,它的优势就是能够更快地帮助开发者开发和构建项目。

从创建一个新项目开始

初始化项目

rye init rye-demo

项目的布局如下,可以看到rye很贴心的做了至少2件事

  • 初始化了git
  • 生成了核心管理文件pyproject.toml.python-version
.
├── .git
├── .gitignore
├── .python-version
├── README.md
├── pyproject.toml
└── src
    └── rye_demo

pyproject.toml

[project]
name = "rye-demo"
version = "0.1.0"
description = "Add your description here"
authors = [
    { name = "xxxx", email = "xxxx" }
]
dependencies = []
readme = "README.md"

requires-python = ">= 3.11, <3.12"

[build-system]
# 可选的构建工具有hatchling, setuptools, flit, pdm, maturin
requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.rye]
managed = true
# 排除了一些间接但是一直都没有用的依赖
excluded-dependencies = []

# rye add --dev xxx
dev-dependencies = []

[tool.hatch.metadata]
allow-direct-references = true

[tool.hatch.build.targets.wheel]
packages = ["src/rye_demo"]

这里解释一下什么是virtual project?对rye来说,Python包大致可以分为二类

  1. real package:目的是为了共享,这也是最常见的包比如fastapi, mkdoc等等,它们作为依赖添加到其他的应用中,提供功能性的作用
  2. virtual project:可以看作是聚合了一堆的依赖包,比如基于fastapi构建的应用,你的目的是为了提供服务而不是依赖,你并不想发布出去当做依赖。从理解角度而言叫"应用"似乎更合适一点

rye的一个特色就是便捷的脚本构建,现在看一下简单的脚本

[tool.rye.scripts]
echo_hello = { cmd = ["echo", "rye"] }

现在运行rye run echo_hello 就会打印rye

支持指定env文件,在开发中,不管是脚本还是应用中通过指定环境变量的方式来配置项目是非常的需要。

[tool.rye.scripts]
echo_env = { cmd = ["python", "src/rye_demo/main.py"], env-file = "my.env" }

main.py内容如下

import os

if __name__ == '__main__':
    print(f"Get KEY = {os.environ.get('KEY')}")

my.env文件如下

KEY=secret...

运行rye run echo_env 就会打印Get KEY = secret...,如果直接运行的话就是Get KEY = None,可以看出rye对开发者天然地友好。

便捷切换不同地Python版本

一定遇到过这样的问题,因为尝试新特性或者由于依赖问题不得不切换不同的Python版本。

现在假设我们要切换到3.11的Python,只需要按照下面的命令就能快速切换。


# 改变.python_version和pyproject.toml文件中的python版本
rye pin --relaxed cpython@3.11

# 下载cpython@3.11,实际上rye fetch是rye toolchain fetch的快捷缩写
rye fetch

# 或者直接用下面的命令
rye fetch cpython@3.9.1

# 验证版本:Python 3.11.9
python --version

#移除
rye toolchain remove 3.8.16

依赖管理

  • 添加依赖: rye add fastapi
  • 下载依赖: rye sync

下载依赖后会生成requirements-dev.lockrequirements.lock二个文件用来锁定版本,当需要进行升级时执行rye sync --update-all就会将所有的依赖更新到最新。

以一个实际的例子开始, 添加fastapi

rye add fastapi
rye sync

新建web_server.py,内容如下

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello World"}

在pyproject.toml中添加启动脚本

[tool.rye.scripts]
server_starter = "fastapi dev src/rye_demo/web_server.py"

执行rye run server_starter就会看到类似如下输出

                                                                                                                                             
 ╭────────── FastAPI CLI - Development mode ───────────╮                                                                                                        
 │                                                     │                                                                                                        
 │  Serving at: http://127.0.0.1:8000                  │                                                                                                        
 │                                                     │                                                                                                        
 │  API docs: http://127.0.0.1:8000/docs               │                                                                                                        
 │                                                     │                                                                                                        
 │  Running in development mode, for production use:   │                                                                                                        
 │                                                     │                                                                                                        
 │  fastapi run                                        │                                                                                                        
 │                                                     │                                                                                                        
 ╰─────────────────────────────────────────────────────╯              

从已有的项目迁移

未完成...

总结

rye目前的官方定位是一个具有实验性质的Python项目管理工具,但是从使用体验来说,具有明显的构建优势和提高开发效率的特点。

新项目的工作流

stateDiagram-v2
    [*] --> 初始化项目: rye init
    初始化项目 --> 设定Python版本: rye pin & rye fetch
    设定Python版本 --> 开发: rye add & rye sync
    开发 --> 测试: rye run python
    测试 --> [*]

王刚
1 声望0 粉丝

一个努力上进的BOY~