uv:终结 Python 虚拟环境管理乱局

摘要
如果你还在 python -m venv .venv && source .venv/bin/activate && pip install -r requirements.txt 这套流程里反复横跳,是时候看看 uv 了。uv 是 Astral(Ruff、ty 的作者)用 Rust 写的 Python 包与项目管理工具,把版本管理、依赖安装、锁文件、虚拟环境、项目管理这五件事揉进一个单文件二进制里,安装速度是 pip 的 10-100 倍,而且完全不需要手动激活环境。
uv 是什么
一句话概括:uv = pyenv(Python 版本管理)+ pip(包安装)+ pip-tools(锁文件)+ venv(虚拟环境)+ poetry/pdm(项目管理)。
它不是又一个"更快的 pip",而是把 Python 生态里长期分裂的这几层工具统一到了一个工具链里:
- Python 版本管理:
uv python install 3.12直接下载对应版本的解释器,不用再单独装 pyenv - 虚拟环境:
uv venv或者干脆不用手动建,uv run会自动检测/创建项目的.venv - 依赖安装与锁定:
uv add/uv sync生成并使用uv.lock,保证团队成员和 CI 装出来的依赖版本完全一致 - 一键运行:
uv run python script.py自动在项目虚拟环境里执行,全程不需要source activate
核心优势:和其他虚拟环境工具比
Python 生态里管理虚拟环境和依赖的工具不少,各自解决的问题也不完全一样:
| 工具 | 定位 | 需要手动 activate? | Python 版本管理 | 锁文件 | 速度 |
|---|---|---|---|---|---|
| uv | 全能(版本+包+环境+项目) | 否,uv run 自动进环境 |
✅ 内置,自动下载 | ✅ uv.lock |
极快 |
| venv(标准库) | 只管环境隔离 | ✅ 必须手动 activate | ❌ | ❌ | 慢 |
| virtualenv | venv 的前身/增强版 | ✅ | ❌ | ❌ | 慢 |
| pip | 只管装包 | 依赖 venv | ❌ | ❌(requirements.txt 不是真锁文件) | 慢 |
| pipenv | pip+virtualenv 整合 | 否,pipenv run |
❌ | ✅ Pipfile.lock | 慢,解析器出了名地卡 |
| poetry | 项目+依赖管理 | 否,poetry run |
❌(要配合 pyenv) | ✅ poetry.lock | 中等 |
| pdm | 类似 poetry,支持 PEP 582 | 否,pdm run |
部分支持 | ✅ pdm.lock | 较快 |
| conda/mamba | 科学计算全家桶 | ✅(也有 conda run) |
✅ | ⚠️ 非严格锁文件 | conda 慢,mamba 快 |
| pyenv | 只管 Python 版本 | 不适用 | ✅ | ❌ | — |
几个容易误解的地方:
- "不用 activate" 不是 uv 独有:poetry/pdm/pipenv 的
xxx run命令本来就能做到不激活直接跑命令,本质都是给子进程临时改 PATH。uv 的优势是把这个模式做到最快、最零配置。 - uv 真正独特之处:一个二进制同时管 Python 版本(不用配 pyenv);全局内容寻址缓存,多个项目共用同一份包的磁盘存储,不重复占空间;完全兼容 pip 接口,
uv pip install可以直接当 pip 替代,迁移成本几乎为零。 - conda 什么时候还该用:项目依赖非 Python 的编译库(CUDA、MKL、某些 R/Julia 绑定)时,conda/mamba 的二进制包管理仍然更合适——uv 只管 Python 生态,不处理系统级二进制依赖。
对 AI 编程助手格外友好
这一点在 AI Agent 编程时代价值被明显放大了:如果你写的 Python 脚本是要交给 AI(Claude Code、Cursor 等)调用执行的,用 uv run 意味着完全不需要在给 AI 的指令里专门交代"先激活虚拟环境再执行程序"这一步。AI 每次工具调用往往是独立的 shell 进程,环境激活状态本来就留不住,稍不注意就会因为忘记 activate 而报 ModuleNotFoundError;而 uv run python xxx.py 每次都会自动定位并使用项目自己的虚拟环境,AI 只要记住这一条命令格式就行,不用理解"环境是否已激活"这个状态问题。这也是为什么现在几乎所有新建的 Python 项目都会直接用 uv 起步——对人省心,对 AI 更省心。
面向人群
- 受够了
venv+pip+requirements.txt这套老流程、想要更快更省心的开发者 - 已经在用 poetry/pdm,但嫌解析器和安装速度不够快的团队
- 需要在 CI 里频繁重建虚拟环境、对安装速度敏感的项目
- 想要一个工具同时搞定 Python 版本切换和依赖管理,减少工具链复杂度的人
- 用 Claude Code、Cursor 等 AI 编程助手写 Python 自动化脚本、不想每次都在 prompt 里教 AI "先激活环境"的人
快速上手
安装(macOS / Linux):
curl -LsSf https://astral.sh/uv/install.sh | sh
Windows 用 PowerShell:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
也可以用已有的包管理器安装,比如 Homebrew:
brew install uv
或者通过 pipx:
pipx install uv
安装指定版本的 Python(不用再单独装 pyenv):
uv python install 3.12
新建一个项目:
uv init myproject
cd myproject
添加依赖(自动创建虚拟环境、更新 pyproject.toml 和 uv.lock):
uv add requests fastapi
运行代码(自动在项目虚拟环境里执行,不需要手动 activate):
uv run python main.py
同步依赖(按 uv.lock 精确还原环境,适合 CI 或团队协作):
uv sync
进阶用法
- 把 CLI 工具变成系统命令,还不污染全局环境(pipx 的直接替代):
uv tool install comfy-cli # 装进独立隔离环境,只把 comfy 命令暴露到 PATH
comfy some-command # 之后直接执行,命令行里不出现 uv,也不用 activate
uv tool update-shell # 首次使用前跑一次,把暴露命令的目录加进 PATH
uv tool list # 看装了哪些工具
uv tool upgrade comfy-cli # 升级
uv tool uninstall comfy-cli # 卸载(连隔离环境一起删掉)
- 把 uv 当 pip 的直接替代(迁移老项目最省事的方式):
uv pip install -r requirements.txt
uv pip compile requirements.in -o requirements.txt
- 像 npx 一样直接运行工具,不用提前安装:
uvx ruff check .
uvx black .
- 多项目 workspace(类似 Cargo 的 workspace 概念,适合 monorepo):
在根目录 pyproject.toml 里声明 [tool.uv.workspace] 后,uv run/uv sync 会理解子项目之间的依赖关系,不需要每个子项目单独管理虚拟环境。
- 锁定依赖但不同步(比如只想更新 lock 文件、暂不落地到本地环境):
uv lock
如果你的项目还停留在 venv + requirements.txt 的年代,花十分钟切到 uv,大概率再也不想回去了——我自己现在所有的 Python 项目都已经全部切到了 uv,不再单独维护 .venv 的激活步骤。
浙公网安备 33010602011771号