经常逛github,看到喜欢的开源 python 项目,老想部署玩玩,又偏爱 uv 来部署,记录个常规过程备忘
1. 初始化 uv 项目
如果项目没有 pyproject.toml 文件,通过 uv init 初始化一个基础的 pyproject.toml 文件。
uv init --bare--bare选项会生成一个最简化的pyproject.toml,不包含示例代码。- 这会在当前目录下创建一个基本的
pyproject.toml,例如:[project] name = "my-project" version = "0.1.0" requires-python = ">=3.8"如何已经存在
pyproject.toml,直接跳到下一步即可
2. 将 requirements.txt 中的依赖添加到 pyproject.toml
uv 提供了 uv add 命令,可以直接从 requirements.txt 文件中读取依赖并添加到 pyproject.toml 中。
运行以下命令:
uv add -r requirements.txt-r表示从指定的requirements.txt文件中读取依赖。- 这会将
requirements.txt中的所有依赖添加到pyproject.toml的[project.dependencies]部分。例如,如果你的requirements.txt内容是:
那么requests==2.28.1 numpy>=1.21.0pyproject.toml会更新为:[project] name = "my-project" version = "0.1.0" requires-python = ">=3.8" dependencies = [ "requests==2.28.1", "numpy>=1.21.0", ]
3. 创建虚拟环境并同步依赖
为了确保依赖正确安装,可以创建一个虚拟环境并同步这些依赖:
uv venv # 创建虚拟环境,默认在 .venv 文件夹中
uv sync # 根据 pyproject.toml 安装依赖到虚拟环境中uv add 的时候会自动创建 .venv ,如果已存在虚拟环境可省略
uv venvuv sync 适用于pyproject.toml存在且已经添加依赖情况下,重新生成虚拟环境 .venv
uv sync会根据pyproject.toml和uv.lock(如果存在)安装所有依赖到虚拟环境中。- 如果你还没有
uv.lock文件,uv sync会自动生成一个,锁定具体的依赖版本。
4. 验证和清理
- 检查
pyproject.toml是否正确包含了所有依赖。 如果确认无误,可以选择删除原来的requirements.txt文件,因为pyproject.toml已经成为依赖管理的“真相来源”。
注意事项
- 版本约束:
uv add -r requirements.txt会保留requirements.txt中的版本约束(如==、>=等),直接迁移到pyproject.toml中。 - 手动调整:如果你的
requirements.txt中包含一些特殊的选项1(例如-e可编辑安装或--index-url),这些需要手动调整到pyproject.toml的 或[tool.uv.sources]部分。例如:
[project]
dependencies = ["torch"]
[tool.uv.sources]
torch = [
{ index = "pytorch-cu118", marker = "sys_platform == 'darwin'"},
{ index = "pytorch-cu124", marker = "sys_platform != 'darwin'"},
]
[[tool.uv.index]]
name = "pytorch-cu118"
url = "https://download.pytorch.org/whl/cu118"
[[tool.uv.index]]
name = "pytorch-cu124"
url = "https://download.pytorch.org/whl/cu124"- 开发依赖:如果
requirements.txt中包含开发依赖(例如pytest),可以用uv add --dev添加到[project.optional-dependencies]的dev组: 结果可能是:uv add --dev pytest -r requirements.txt[project.optional-dependencies] dev = [ "pytest>=7.0.0", ]
示例完整流程
假设你的 requirements.txt 是:
requests==2.28.1
numpy>=1.21.0
pytest>=7.0.0执行以下命令:
uv init --bare
uv add -r requirements.txt
uv add --dev pytest # 将 pytest 单独作为开发依赖
uv sync最终 pyproject.toml 可能是:
[project]
name = "my-project"
version = "0.1.0"
requires-python = ">=3.8"
dependencies = [
"requests==2.28.1",
"numpy>=1.21.0",
]
[project.optional-dependencies]
dev = [
"pytest>=7.0.0",
]5. 生成 requirements.txt(可选)
如果你的生产环境仍然需要 requirements.txt,可以用以下命令生成:
uv pip compile pyproject.toml -o requirements.txt这会根据 pyproject.toml 生成一个带有具体版本的 requirements.txt,供非 uv 环境使用。
通过以上步骤,你可以顺利将 requirements.txt 转换为 uv 的 pyproject.toml,并保持依赖同步。