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 版本 不适用

几个容易误解的地方:

  1. "不用 activate" 不是 uv 独有:poetry/pdm/pipenv 的 xxx run 命令本来就能做到不激活直接跑命令,本质都是给子进程临时改 PATH。uv 的优势是把这个模式做到最快、最零配置。
  2. uv 真正独特之处:一个二进制同时管 Python 版本(不用配 pyenv);全局内容寻址缓存,多个项目共用同一份包的磁盘存储,不重复占空间;完全兼容 pip 接口,uv pip install 可以直接当 pip 替代,迁移成本几乎为零。
  3. 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.tomluv.lock):

uv add requests fastapi

运行代码(自动在项目虚拟环境里执行,不需要手动 activate):

uv run python main.py

同步依赖(按 uv.lock 精确还原环境,适合 CI 或团队协作):

uv sync

进阶用法

  1. 把 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 # 卸载(连隔离环境一起删掉)
  1. 把 uv 当 pip 的直接替代(迁移老项目最省事的方式):
uv pip install -r requirements.txt
uv pip compile requirements.in -o requirements.txt
  1. 像 npx 一样直接运行工具,不用提前安装
uvx ruff check .
uvx black .
  1. 多项目 workspace(类似 Cargo 的 workspace 概念,适合 monorepo):

在根目录 pyproject.toml 里声明 [tool.uv.workspace] 后,uv run/uv sync 会理解子项目之间的依赖关系,不需要每个子项目单独管理虚拟环境。

  1. 锁定依赖但不同步(比如只想更新 lock 文件、暂不落地到本地环境):
uv lock

如果你的项目还停留在 venv + requirements.txt 的年代,花十分钟切到 uv,大概率再也不想回去了——我自己现在所有的 Python 项目都已经全部切到了 uv,不再单独维护 .venv 的激活步骤。

posted @ 2026-07-13 09:53  RobinDevNotes  阅读(8)  评论(0)    收藏  举报