本文与《Python-环境管理-包管理器-uv》同系列:上一篇偏背景与选型,本篇偏怎么在脑子里摆放 uv 的各个概念,以及日常命令与示例。具体行为以官方文档为准:https://docs.astral.sh/uv/。
段末注释:CLI(命令行界面,Command Line Interface)指终端里使用的
uv命令;PEP(Python Enhancement Proposal)为 Python 改进提案编号。
1. uv 的心智模型:把五件事摆到一张桌上
可以先把 uv 想成围绕 「一个项目目录」 工作的 单入口 CLI:它把过去分散在 pip、venv、pyenv(或系统 Python)里的动作,收成几条稳定的主路径。下面五块拼图一起记,就不容易迷路。
1.1 项目是真源(pyproject.toml)
- 依赖声明(依赖谁、版本约束)写在
pyproject.toml里,符合 PEP 621 等社区惯例。 - 你心里默认:改依赖 = 先改声明,再同步到环境,而不是「先 pip 装一堆,最后才想起来导出」。
- 与
uv.lock、.venv的分工对照见 §4。
1.2 锁文件是可复现快照(uv.lock)
uv.lock(若使用锁定工作流)记录解析结果的精确版本,用于团队与 CI 对齐「装出来一样」。- 心智上把它当作 「依赖解析的 git 快照」:提交到仓库,和 Cargo 的 Cargo.lock 类比最顺。
- 三件套对比与命令关联见 §4.2–§4.3。
段末注释:CI(持续集成,Continuous Integration)指自动构建与测试流水线。
1.3 虚拟环境是项目本地的「安装目录」
- 默认会在项目下使用
.venv(名称与路径可按约定调整),里面是可执行的python与已装包。 - 不要和「全局系统 Python」混成同一套心智:日常开发以 项目
.venv为准。
1.4 全局缓存加速重复安装
- uv 在机器上维护包缓存(概念上接近 pnpm 的 store):不同项目共享下载与构建产物,重复安装更快。
- 你通常不需要手动管理缓存,知道「为什么第二次特别快」即可。
1.5 三条高频主路径
| 你想做什么 | 典型心智 | 常见入口 |
|---|---|---|
把声明和锁文件落实到 .venv |
「同步环境」 | uv sync |
| 不手动激活 venv 就跑命令 | 「项目上下文运行」 | uv run ... |
| 临时跑一个 PyPI 上的 CLI 工具 | 「一次性工具」 | uvx 某工具 |
1.6 原理与架构:数据流与执行分层(示意)
下面路线图帮助建立直觉(不对应 uv 源码模块名)。可与《Python-环境管理-包管理器-uv》中的背景介绍对照阅读。
图 A 从声明到可运行环境(依赖闭环)

逻辑:先声明(pyproject.toml),再解析出精确版本写入 uv.lock,最后安装进 .venv;全局缓存参与去重加速,包索引(如 PyPI)为解析与下载提供元数据与制品。
1 | flowchart TD |
段末注释:site-packages 为当前解释器加载第三方包的默认目录;后文沿用「缓存」指 uv 在本机的包存储与复用层。
图 B uv run 的执行链(项目内)

执行架构:uv run 先定位项目根与配置,再判断 .venv 是否与锁/声明一致;必要时创建或更新环境,最后在子进程里启动 python 或其它入口(如 pytest)。PEP 723 单文件脚本走类似「先满足脚本元数据再执行」的路径,细节以官方 Scripts 文档为准。
1 | flowchart LR |
图 C CLI 能力分层(单入口下的分工)

架构直觉:对外是一个 uv 二进制;对内可粗分为 项目/锁文件、虚拟环境与安装、Python 解释器管理、隔离工具环境(uvx) 等能力块,它们共享缓存与对索引网络的访问。
1 | flowchart TB |
2. 常用命令地图(按任务记)
以下为分类速查,选项与子命令细节以 uv --help 与官方文档为准。
2.1 安装 uv 本体(以 Linux 为例)
下面以常见 GNU/Linux 发行版为例,给出可照抄的安装与校验流程;其它系统见官方 Installation:https://docs.astral.sh/uv/getting-started/installation/。
环境准备(示例):若尚未安装 curl,在 Debian/Ubuntu 上可先执行 sudo apt update && sudo apt install -y curl;其它发行版用对应的包管理器安装 curl 或 wget 即可。
方式一:官方独立安装脚本(推荐)
依赖:系统已安装 curl 或 wget,且能对公网 HTTPS 访问 astral.sh(企业内网需自行配置代理或镜像策略)。安装前若希望审阅脚本内容,可先:curl -LsSf https://astral.sh/uv/install.sh | less,再决定是否执行安装。
用 curl 一键安装(脚本将二进制装到用户目录,默认多为 ~/.local/bin):
1 | curl -LsSf https://astral.sh/uv/install.sh | sh |
没有 curl 时可用 wget:
1 | wget -qO- https://astral.sh/uv/install.sh | sh |
安装脚本会提示是否把上述目录加入 PATH;若当前 shell 里还找不到命令,可先执行(Bash 示例):
1 | export PATH="$HOME/.local/bin:$PATH" |
校验:
1 | uv --version |
方式二:指定版本安装(示例)
需要与团队或 CI 对齐某一版本时,可把版本号写进 URL(具体版本号以 GitHub Releases 为准):
1 | curl -LsSf https://astral.sh/uv/0.11.7/install.sh | sh |
方式三:通过 PyPI(适合已有 Python 且希望用包管理器管理 uv 自身)
官方建议把 uv 装在隔离环境里,例如 pipx:
1 | pipx install uv |
若临时使用 pip 全局安装(可能与其它全局包混用,一般不优先推荐):
1 | python3 -m pip install --user uv |
安装后常用维护
- 升级(独立安装脚本方式安装的 uv 通常支持):
uv self update - 查看帮助:
uv --help、uv help
段末注释:PATH 为操作系统查找可执行文件的目录列表;HTTPS 为 HTTP 的安全传输层;后文沿用 PATH。
2.2 项目管理:init / add / remove / sync / lock
uv init:在当前目录初始化pyproject.toml(可选模板、包名等)。uv add 包名:把依赖写入pyproject.toml并安装,同时更新锁文件(在使用锁文件的工作流下)。uv remove 包名:从声明中移除并同步环境。uv lock:仅解析并写锁文件,不装环境(适合只想更新锁、或交给 CI 的场景)。uv sync:按pyproject.toml+uv.lock创建/更新.venv并安装,是「拉代码后对齐环境」的主命令。
2.3 运行:uv run
uv run python main.py:在项目环境里执行,无需先source .venv/bin/activate(类 Unix)或手动激活(Windows)。uv run pytest:同理,用项目依赖跑测试命令。
2.4 工具运行:uvx(类比 pipx)
uvx ruff check .:按需准备工具环境并执行,适合 linter、formatter、一次性 CLI。- 心智:不污染当前项目依赖,又不必全局
pip install。
2.5 Python 版本:uv python
uv python install 3.12:安装并管理可用的 Python 解释器(具体行为依平台而定)。uv python pin 3.12:在项目中钉住 minor 版本,配合pyproject.toml/工具链约定,减少「我机器上是 3.11、你的是 3.12」的漂移。
2.6 与 pip 兼容:uv pip ...
uv pip install等子命令提供 pip 兼容路径,便于迁移旧脚本;新项目仍建议以pyproject.toml+uv sync为主。
3. 示例(可复制)
以下示例假设已安装 uv,且当前 shell 在项目根目录。包名与版本仅作演示。
3.1 从零建一个应用项目
1 | uv init myapp |
uv init myapp新建目录并生成pyproject.toml等骨架(也可用uv init在当前目录初始化;库形态见--lib等选项,以官方 Creating projects 文档为准)。uv add声明并安装依赖,并更新uv.lock(在使用锁定工作流时)。uv run在项目环境里执行,无需手动激活 venv。
3.2 克隆已有仓库后对齐环境
1 | git clone <repo-url> && cd <repo> |
- 仓库若已提交
uv.lock,uv sync会把.venv装到与锁文件一致的状态,再跑测试。
3.3 单文件脚本 + 内联依赖(PEP 723 风格)
将依赖写在脚本头部元数据中(PEP 723 内联脚本元数据;键名以官方 Scripts 文档为准),例如:
1 | # /// script |
保存为 script.py 后:
1 | uv run script.py |
- 心智:脚本自描述依赖,
uv run负责准备环境;适合小工具、一次性任务,而不是替代完整项目结构。
3.4 用 uvx 跑一次性工具
1 | uvx ruff check . |
- 不必把 ruff 写进项目依赖,也能在 CI 或本地快速执行(是否固定版本、是否缓存,见
uvx文档选项)。
4. pyproject.toml → uv.lock → .venv:三件套
在 uv 的环境管理闭环里,声明 → 锁定 → 安装 分别落在三个文件/目录上。理解它们的分工,比死记子命令更不容易在「改了依赖但环境没变」「锁文件和 venv 不一致」时踩坑。
4.1 在环境管理中的角色
1 | pyproject.toml uv.lock .venv |
| 环节 | 文件/目录 | 在流程中的位置 |
|---|---|---|
| 1. 声明 | pyproject.toml |
项目真源:依赖名、版本约束、Python 版本、工具配置 |
| 2. 锁定 | uv.lock |
解析器输出的精确版本快照(除了直接依赖还包含间接依赖包的版本),供团队与 CI 对齐 |
| 3. 安装 | .venv/ |
当前项目本地虚拟环境:解释器 + site-packages |
完整运行链为 pyproject.toml → uv.lock → .venv → uv run:前三级负责「环境长什么样」,uv run 负责「在已对齐的环境里执行命令」(见 §1.5、§1.6)。
4.2 分工异同与主要特征

图 D 概括三者的角色、维护者、内容与类比;下表便于速查异同。
| 维度 | pyproject.toml |
uv.lock |
.venv/ |
|---|---|---|---|
| 类型 | 项目配置文件 | 锁文件 | 目录(虚拟环境) |
| 核心问题 | 项目需要哪些依赖? | 具体装哪些版本? | 本机已安装什么? |
| 谁维护 | 开发者编辑;uv add/remove 也会改 |
uv 自动生成(lock/add/sync) |
uv sync 创建与更新 |
| 版本粒度 | 范围约束(如 >=2.0,<3) |
精确版本 + 哈希 | 已安装 wheel/sdist |
| 是否提交 Git | 必提交 | 锁定工作流下建议提交 | 通常不提交(加入 .gitignore) |
| 可否手改 | 可以(改完需 lock/sync) |
不建议(改坏可删锁重算) | 不要手改(用 sync 对齐) |
| 类比 | package.json / Cargo.toml |
Cargo.lock / package-lock.json |
node_modules 里的运行时(但更隔离) |
| 缺失时 | 不是 uv 项目 / 无依赖声明 | 每次解析可能装不同小版本 | uv run 会触发创建或报错 |
相同点:三者共同描述「这个项目用什么 Python、用什么第三方包」;uv sync 以 pyproject.toml + uv.lock 为输入,把状态写入 .venv。
不同点:
- 抽象层级:toml 是意图,lock 是决议,venv 是物理安装;
- 复现性:只有 lock + sync 才能保证跨机器装出一致版本;仅 toml 不够;
- 生命周期:toml/lock 跟仓库走;venv 跟本机项目目录走,删了可
uv sync重建。
4.3 与 uv 命令的关联

图 E 展示常见子命令读/写哪些产物;下表与 §2.2 对照。
| 命令 | pyproject.toml |
uv.lock |
.venv/ |
典型场景 |
|---|---|---|---|---|
uv init |
创建/写 | — | 可选创建 | 新建项目 |
uv add / uv remove |
读+写 | 写 | 更新 | 增删依赖并安装 |
uv lock |
读 | 写 | 不动 | 只更新锁,CI 或审阅 lock diff |
uv sync |
读 | 读 | 创建/更新 | 克隆仓库后对齐环境(§3.2) |
uv run |
读(校验) | 读(校验) | 读/按需 sync | 跑脚本、测试、CLI |
uv pip install ... |
通常不写 | 通常不写 | 写 | 兼容 pip 路径,新项目少用 |
读/写语义:
- 写 toml:表达「要什么」——
init、add、remove; - 写 lock:表达「解析结果」——
lock、add、remove(在锁定工作流下); - 写 venv:表达「装到位」——
sync、add(带安装时)、run(环境不一致时会先 sync)。
两条日常路径:
1 | 改依赖: uv add/remove → toml + lock + .venv 一并更新 |
不一致时怎么办:若手动改了 pyproject.toml 但未更新 lock/venv,执行 uv lock 或 uv sync(一般直接 uv sync 即可同时对齐 lock 与 venv);不要只改 lock 或只删 .venv 而不同步声明。
4.4 与上一篇的关系
- 选型、与 Conda/venv 对比:见《Python-环境管理-包管理器-uv》。
- 日常落地:以
sync/run/uvx/python pin为骨架;三件套记忆锚点为 §4.1–§4.3,原理示意图见 §1.6。
5. 延伸阅读
- 官方文档:https://docs.astral.sh/uv/
- 仓库:https://github.com/astral-sh/uv
- 姊妹篇(背景与选型):本站《Python-环境管理-包管理器-uv》