老朋友pip与venv的缺陷
在介绍 uv 之前,让我们先快速回顾一下传统的 Python 项目管理方式——pip+venv 的工作流程:
首先在系统上 安装对应的 Python 版本 ;
创建虚拟环境:python -m venv .venv;
在当前目录 激活环境
Windows:.venv\Scripts\activate;
macOS/Linux:source .venv/bin/activate;
使用 pip 安装依赖 :pip install openai;
生成 依赖文件 :pip freeze > requirements.txt;
同步 环境依赖 :pip install -r -requirements.txt;
这个流程虽然能用,但是作为开发者,期间会遇到非常多的问题:
慢 :pip 的依赖解析和安装速度,在项目变大时,会变得异常缓慢。
繁琐 :每次打开新终端,都得手动 source .../activate 才能激活环境,很容易忘记。
无多版本管理 :运行 python -m venv .venv 命令时,它会使用您当前系统上默认的 Python 版本来 创建虚拟环境,只有已安装的 Python 版本才可以创建虚拟环境,否则无法直接创建。
依赖不精确 :pip freeze 会把子依赖也冻结进去,但我们真正关心的,其实是 fastapi、uvicorn 这 些直接依赖。这导致了requirements.in 和 requirements.txt 的分离管理,增加了心智负担,同时 pip 没有依赖预检功能,很容易造成依赖冲突。
uv实战上手:三步建立现代化工作流
随着 Python 的普及度越来越高,传统的 pip + venv 的工作流方式已经不太适用,在 2024 年 2 月 uv 也 应运而生,这是由 Astral 公司使用 Rust 开发的一款非常新的 Python 打包和项目管理工具,uv 官方文 档:https://docs.astral.sh/uv/。它以其惊人的速度而闻名,uv 的特点也非常明显:
出身名门 :由开发了 ruff(超快的Python Linter)的Astral公司打造。
快得离谱 :因为它底层是用Rust编写,并且采用了先进的并行处理和全局缓存策略,它的速度可以 比 pip 快 10-100倍 !
多合一工具箱 :它不仅仅是 pip 的替代品,它还整合了 venv, pip-tools, python 版本管理等工具的 功能,提供了一站式的解决方案。
虽然才诞生一年多,但是越来越多的 Python 项目里都有 uv 的身影,例如:Dify、MCP、A2A、 MetaGPT、FlowRAG、Refly.ai 等。
uv 支持 macOS/Linux/Windows 系统,并且在安装前可以不用配置 Python 环境,使用一行命令即可快 速安装:
# macOS and Linux
curl-LsSf https://astral.sh/uv/install.sh | sh
wget-qO- https://astral.sh/uv/install.sh | sh
curl-LsSf https://astral.sh/uv/0.8.14/install.sh | sh
# Windows
powershell -ExecutionPolicy ByPass -c"irm https://astral.sh/uv/install.ps1 |
iex"甚至可以在 Github 上下载 uv 编译好的可执行文件,解压存储到电脑中,同时将该路径添加到环境变量 的 path 中即可,链接:https://github.com/astral-sh/uv/releases
安装成功后,在命令行执行 uv --version 看到版本号即代表成功:
uv --version
uv 0.8.14 (af856fb88 2025-07-01)现在 uv 将彻底改变你创建和使用虚拟环境的方式,你可以快速通过命令为每个项目创建一个不同版本独 立的 Python 虚拟环境,例如:
uv venv --python3.12上述命令会在当前目录下创建一个 .venv 的虚拟环境,并安装 python3.12 版本,如果想在命令行激 活当前环境,和以往使用相同的命令即可,如下:
# CMD
.venv\Scripts\activate.bat
# Powershell/win11
.venv\Scripts\activate.ps1
# bash
source .venv/Scripts/activate另外如果在 win11 下执行 .venv\Scripts\activate.ps1 出现错误,这是因为 PowerShell 执行政策 导致的,可以使用以下方式解决:
# 临时允许脚本(推荐)
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
# 针对当前用户永久放宽
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned这样就可以执行并激活环境了,如下:

同时如果你想使用原先 pip-tools 的工作流,操作技巧也非常简单,只需要在原先的命令前带上 uv 即 可,例如:
uv pip install fastapi "uvicorn[standard]"
uv pip compile requirements.in -o requirements.txt
uv pip sync requirements.txt这也是传统的工作流,在一个 Python 项目下可能会有一堆配置文件:setup.py, requirements.txt, requirements-dev.txt 等,简直是一场噩梦,所以更推荐使用 uv+pyproject.toml 这种工作流方式, 这是一个由官方PEP标准定义的、统一的配置文件,用于存放:
项目基本信息(项目名、版本、作者...)
项目依赖 (dependencies)
开发环境依赖 (dev-dependencies)
构建工具配置
测试、Linter等工具的配置
uv 天生就围绕这个文件工作,为我们提供了一套极致丝滑的体验,在项目下运行 uv init 即可自动生 成这些配置,基础配置如下:
[project]
name = "mas-study"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
"openai>=1.102.0",
]在这个工作流下,我们就可以完全抛弃 pip-tools 的写法,而是使用 uv 提供的其他命令:
安装依赖:uv add fastapi "uvicorn[standard]",该命令会自动将依赖的版本写入到
pyproject.toml中,同时为该依赖添加锁uv.lock,以确保环境完全一致,无需手动编辑requirements.in在生成requirements.txt;卸载依赖:uv remove fast api "uvicorn[standard]",该命令会卸载依赖,并移除依赖中的版本信 息与锁;
开发环境依赖:在
add和remove命令后带上 --dev 参数,即会添加或者移除一个开发依赖;执行命令:以往需要激活环境后才能运行命令,现在可以执行运行
uv run <command>在项目中 快速执行命令而无需提前激活;同步环境:uv sync,该命令会按照
pyproject.toml创建一个虚拟环境,并安装所有的依赖信 息;
哪怕整个项目想同步创建一份 pip-tools 的依赖文件,也可以通过 uv export -o requirements.txt 快速生成,高效与兼容两不误,当然关于 export 这个命令还有很多参数的写法,感 兴趣的同学可以在课后和 DeepSeek 聊天获取。
uv 常用命令速查表
虽然在项目中使用的 uv 命令并不多,为了方便大家在后续开发中随时查阅,我为大家整理了一份更详尽 的 uv 命令速查表,覆盖了从项目初始化到日常开发的方方面面,希望对大家有帮助:
评论