pip 已经老了!2026 年最值得尝试的 Python 包管理工具——UV 完全指南
文章摘要
还在为
pip install的龟速抓狂吗?还在conda和virtualenv之间反复横跳吗?本文带你深入了解 UV —— 这款由 Astral 团队(Ruff 作者)打造的下一代 Python 包管理工具。基于 Rust 编写的它,依赖解析速度比 pip 快 10-100 倍,创建虚拟环境仅需 10ms。
从安装配置到镜像源优化,从项目初始化到日常开发,一文讲透 UV 的核心用法和实战技巧。读完这篇文章,你将彻底告别 Python 包管理的痛苦,享受丝滑般的开发体验。
三、开头
那个让我怀疑人生的下午
上周三下午三点,新来的实习生小王跑过来找我:
“哥,我环境配了一上午了,pip 一直卡在下载依赖那里……”
我走过去一看,好家伙:
- 终端里
pip install numpy pandas scikit-learn已经跑了 8 分钟 - 进度条卡在 47% 一动不动
- 小王的表情已经从期待变成了绝望 😅
我当时就笑了——这场景太熟悉了。
想当年我也是这么过来的:
$ pip install -r requirements.txt
# 等待中... 1分钟... 3分钟... 5分钟...
# Collecting tensorflow (2.4GB)
# 还要等 15 分钟... ❌
Python 的包管理,简直就是开发者的噩梦。
- pip 慢得像蜗牛爬
- conda 重得像头大象
- virtualenv 还要搭配一堆工具才能用
直到我遇到了 UV。
第一次用它的时候,我以为终端坏了——
因为太快了,快到我还没反应过来,就已经装完了。
今天这篇文章,我就把 UV 从入门到上手的完整经验分享给你。
看完就能用,用完就回不去。
四、问题背景
为什么我们被包管理折磨了这么多年?
先说说 pip 的"罪状"
pip 是 Python 的官方包管理器,就像是一个老实但效率低下的老员工。
它的优点:
- ✅ 简单易学
- ✅ 官方支持
- ✅ 生态完善
但缺点也很明显:
❌ 罪状一:慢到让人怀疑人生
# 安装一个常见的数据科学栈
pip install numpy pandas scikit-learn
# 等待时间:约 45 秒 ~ 2 分钟(取决于网络)
我在项目里遇到过这样的场景:
本地
pip freeze > requirements.txt,部署到服务器一跑:ERROR: Package 'xxx' requires a different Python: ">=3.9" but you have "3.8"当场崩溃。
原因?requirements.txt 没有精确锁定依赖版本,导致不同机器安装结果不一致。
❌ 罪状二:依赖解析是串行的
想象一下你去超市买东西:
- pip 的方式:一个一个商品去收银台排队结账
- UV 的方式:所有商品一起扫码,一次性结账
这就是为什么大型项目的依赖解析能跑到你怀疑人生。
再看看 conda 的"双面性"
conda 就像是全能但臃肿的瑞士军刀。
优点:
- ✅ 支持非 Python 依赖(CUDA、MKL 等)
- ✅ 环境隔离做得好
- ✅ 科学计算生态完善
缺点:
- ❌ 安装体积大(Miniconda 就几百 MB)
- ❌ 依赖解析逻辑复杂,容易卡住
- ❌ 启动慢,每次激活都要等
最痛苦的:工具链割裂
传统方案需要组合 5 个工具:
| 功能 | 需要的工具 |
|---|---|
| 包安装 | pip |
| 虚拟环境 | virtualenv / venv |
| 依赖锁定 | pip-tools |
| 版本管理 | pyenv |
| 全局工具 | pipx |
5 个工具,5 套命令,5 种配置方式。
新手看完直接劝退,老手也经常记混命令。
我曾经因为忘记激活虚拟环境,把包装到了系统 Python 里,
然后花了两个小时才清理干净…… 😭
UV 是什么?
用一句话解释
UV = pip + virtualenv + pip-tools + pyenv + pipx
一个工具,替代整个 Python 工具链。
谁做的?
Astral 团队——你可能没听过这个名字,但你一定用过他们的另一个产品:
Ruff(那个比 Flake8 快几十倍的 Python linter)
这群人专门做让 Python 开发更快的工具。
核心特性(人话版)
| 特性 | 说人话 |
|---|---|
| ⚡ 极致性能 | Rust 写的,比 pip 快 10-100 倍 |
| 🎯 统一管理 | 不用再装一堆工具了 |
| 🔒 依赖锁定 | 保证你和同事的环境一模一样 |
| 🚀 零配置启动 | 不用手动激活虚拟环境 |
| 📦 全局缓存 | 装过的包不用再下载 |
| 🛠️ 兼容性好 | 支持 PyPI、requirements.txt、pyproject.toml |
性能实测(官方数据)
| 操作 | pip | uv | 提升倍数 |
|---|---|---|---|
| 安装 numpy+pandas+scikit-learn | ~45s | ~8s | 5-6x |
| 创建虚拟环境 | ~800ms | ~10ms | 80x |
| 依赖解析(大型项目) | 数分钟 | 数秒 | 10-100x |
看到这些数据,我当时就惊了:
这不是升级,这是降维打击。
五、实战指南:从零上手 UV
5.1 安装 UV(3 种方式任选)
方式一:pip 安装(最简单)
pip install uv
✅ 适合:已经在用 Python,不想折腾的人
⚠️ 注意:建议在虚拟环境中安装
方式二:官方脚本(推荐 ⭐)
Windows (PowerShell):
irm https://astral.sh/uv/install.ps1 | iex
macOS / Linux:
curl -LsSf https://astral.sh/uv/install.sh | sh
✅ 优点:获取最新版本,独立于 Python 环境
方式三:Homebrew(macOS/Linux 用户)
brew install uv
验证安装
uv --version
# 输出示例:uv 0.4.27
看到版本号?恭喜你,已经成功一半了!🎉
5.2 配置国内镜像源(⚡ 必做!)
为什么必须换镜像源?
不换的话:
$ uv add requests
# 等待中... 30秒... 60秒...
# Connection timeout ❌
# 或者速度只有几 KB/s(比我奶奶的网还慢)
换完之后:
$ uv add requests
# ✅ 0.8s 完成(快到飞起)
这差距,谁用谁知道。
配置方法(二选一)
✅ 推荐方案:系统级配置(一次配置,永久生效)
Windows (PowerShell):
[System.Environment]::SetEnvironmentVariable("UV_DEFAULT_INDEX", "https://pypi.tuna.tsinghua.edu.cn/simple", "User")
macOS / Linux:
echo 'export UV_DEFAULT_INDEX=https://pypi.tuna.tsinghua.edu.cn/simple' >> ~/.zshrc && source ~/.zshrc
备选方案:项目级配置
在项目根目录创建 uv.toml:
[tool.uv]
index-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
⚠️ 缺点:每个项目都要配一遍,麻烦
国内镜像源推荐
| 来源 | 地址 | 推荐指数 |
|---|---|---|
| 清华大学 | https://pypi.tuna.tsinghua.edu.cn/simple |
⭐⭐⭐⭐⭐ (稳定) |
| 阿里云 | https://mirrors.aliyun.com/pypi/simple/ |
⭐⭐⭐⭐ (速度快) |
| 腾讯云 | https://mirrors.cloud.tencent.com/pypi/simple/ |
⭐⭐⭐⭐ (南方友好) |
| 中科大 | https://pypi.mirrors.ustc.edu.cn/simple/ |
⭐⭐⭐⭐ (教育网) |
个人推荐清华源,用了半年没出过问题。
5.3 创建你的第一个 UV 项目(手把手教程)
第一步:初始化项目
# 创建项目目录
mkdir my-project && cd my-project
# 初始化(自动生成配置文件)
uv init
执行后会生成:
my-project/
├── .python-version # Python 版本声明
├── pyproject.toml # 项目配置文件(核心!)
└── uv.lock # 依赖锁文件(首次 sync 后生成)
这些文件都是干嘛的?
.python-version:告诉 UV 用哪个 Python 版本pyproject.toml:项目的"身份证",记录所有依赖和配置uv.lock:环境的"快照",保证大家的环境一模一样
第二步:查看生成的配置
[project]
name = "my-project"
version = "0.1.0"
description = "Add a short description here"
readme = "README.md"
requires-python = ">=3.11"
dependencies = []
这就是现代 Python 项目的标准格式,比 requirements.txt 规范多了。
第三步:添加依赖
# 添加生产依赖(比如 Web 框架)
uv add fastapi
# 一次添加多个
uv add requests pandas
# 添加开发依赖(测试、代码格式化工具)
uv add --dev pytest
uv add --dev black ruff
添加后,pyproject.toml 会自动更新:
[project]
dependencies = [
"fastapi>=0.115.0",
"requests>=2.32.3",
"pandas>=2.2.3",
]
[dependency-groups]
dev = [
"pytest>=8.3.4",
"black>=24.10.0",
"ruff>=0.8.0",
]
注意看,版本号自动锁定了!
这就是 UV 的智能之处——它帮你选了最合适的版本,避免了版本冲突。
第四步:同步环境
uv sync
这条命令会:
- 自动创建
.venv虚拟环境(如果不存在) - 根据
pyproject.toml和uv.lock安装所有依赖 - 保证环境完全可重现
再也不用手动这三步了:
- ❌
python -m venv .venv - ❌
source .venv/bin/activate - ❌
pip install -r requirements.txt
现在一条命令搞定一切。
第五步:运行项目
# 直接运行脚本(自动使用 .venv 环境)
uv run main.py
# 运行单个命令
uv run python --version
# 运行测试
uv run pytest
重点来了:不需要手动激活虚拟环境!
UV 会自动识别 .venv,直接在其中运行命令。
这对新手来说太友好了——再也不用纠结"我到底激活了没有"这个问题。
我曾经因为忘了激活环境,
把 pytest 装到了系统 Python 里,
然后其他项目全报错…… 😭
有了 UV,这种蠢事再也不会发生了。
5.4 常用命令速查表(建议收藏)
| 操作 | 命令 | 说明 |
|---|---|---|
| 初始化项目 | uv init |
生成 pyproject.toml |
| 添加依赖 | uv add <pkg> |
自动更新配置 |
| 移除依赖 | uv remove <pkg> |
清理依赖和锁文件 |
| 同步环境 | uv sync |
创建/更新虚拟环境 |
| 运行脚本 | uv run script.py |
自动识别 .venv |
| 创建虚拟环境 | uv venv |
单独创建环境 |
| 查看版本 | uv --version |
检查安装状态 |
| 更新 UV | uv self update |
升级到最新版 |
5.5 进阶技巧(用了就回不去)
1️⃣ 管理 Python 版本
# 安装指定版本的 Python
uv python install 3.11
uv python install 3.12
# 查看已安装的版本
uv python list
# 使用特定版本创建环境
uv venv --python 3.11
UV 内置了类似 pyenv 的功能,不需要额外安装版本管理工具。
以前我要装 Python 3.11 要折腾半天,
现在
uv python install 3.11一条命令搞定。真香。⚡
2️⃣ 运行一次性脚本(临时任务神器)
有时候你要写个临时脚本处理数据,不想创建整个项目:
# /// script
# requires-python = ">=3.11"
# dependencies = [
# "requests>=2.32.0",
# ]
# ///
import requests
response = requests.get("https://httpbin.org/get")
print(response.json())
运行时 UV 会自动安装所需依赖:
uv run script.py
非常适合临时脚本和数据清洗任务。
3️⃣ 使用全局工具(替代 pipx)
# 直接运行 CLI 工具,无需永久安装
uvx black --check my_script.py
uvx ruff check .
uvx httpie https://example.com
uvx 是 UV 的全局工具运行器,类似于 pipx,但更快更轻量。
我以前用 pipx 装 black 要等好几秒,
现在 uvx 黑一下就好了。
这种体验差距,用过就懂。😄
4️⃣ 从老项目迁移
如果你有一个用 pip 管理的老项目:
# 进入项目目录
cd your-old-project
# 从 requirements.txt 导入依赖
uv init
uv add -r requirements.txt
# 或者直接转换
uv pip compile requirements.txt -o pyproject.toml
迁移成本极低,基本无痛切换。
六、UV vs 传统工具对比
核心能力对比
| 能力 | pip + virtualenv | conda | UV | 胜出者 |
|---|---|---|---|---|
| 包安装速度 | ⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | UV |
| 依赖解析速度 | ⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | UV |
| 虚拟环境管理 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | Conda |
| Python 版本管理 | ❌ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 平手 |
| 非 Python 依赖 | ❌ | ⭐⭐⭐⭐⭐ | ❌ | Conda |
| 锁文件支持 | ⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | UV |
| 学习曲线 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ | pip |
| 工具统一性 | ⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | UV |
| CI/CD 友好度 | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | UV |
选型建议(人话版)
✅ 选 UV 的场景(90% 的情况)
- Web 开发(Django, FastAPI, Flask)
- 自动化脚本和工具开发
- CI/CD 流水线(追求极速构建)
- 容器化部署(Docker 镜像构建)
- 团队协作项目(需要环境一致性)
- 个人学习和练手项目
✅ 选 Conda 的场景(特殊情况)
- 数据科学和机器学习项目
- 需要 CUDA/MKL 等非 Python 依赖
- 科学计算密集型任务
💡 我的建议
90% 的 Python 开发场景,UV 都是最好的选择。
只有涉及科学计算和非 Python 依赖时,才考虑 Conda。
如果你不确定,先用 UV,遇到问题再换 Conda 也不迟。
七、踩坑经验(血泪总结)
在实际项目中使用 UV,我踩过不少坑,现在全部分享给你:
坑 1:镜像源配置不生效
症状:配置了镜像源,但下载还是很慢
原因:环境变量没有重新加载
解决:
# Windows: 重启终端或 CMD
# macOS/Linux:
source ~/.zshrc # 或 source ~/.bashrc
验证是否生效:
echo $UV_DEFAULT_INDEX
# 应该输出你设置的镜像地址
我当时配完以为好了,结果还是慢,
查了半天才发现是终端没重启……
这种低级错误,踩过一次就够了。😅
坑 2:权限问题(Windows 用户注意)
症状:安装时报权限错误
解决:
# 以管理员身份运行 PowerShell
# 或安装到用户目录
irm https://astral.sh/uv/install.ps1 | iex
坑 3:与现有 pip 环境冲突
症状:uv add 之后,pip list 看不到包
原因:UV 使用独立的 .venv 环境,不影响系统 Python
解决:
# 使用 UV 的命令操作环境
uv pip list # 查看 UV 管理的包
uv run python -m pip list # 在 .venv 中运行 pip
这个坑我替你踩过了:
以为 UV 和 pip 共享环境,
结果两边装的包互相看不到,
浪费了半小时排查…… 😤
坑 4:锁文件冲突(多人协作必看)
症状:多人协作时 uv.lock 经常冲突
原因:不同人添加依赖的顺序不同
解决:
# 统一使用 uv sync 同步环境
# 不要手动编辑 uv.lock
git checkout uv.lock # 冲突时恢复
uv sync # 重新生成
我们团队刚开始用 UV 时,
几乎每次合并代码都冲突,
后来约定好只通过 uv sync 管理,
世界清净了。🕊️
八、最佳实践(经验之谈)
基于我的实战经验,总结几点最佳实践:
1️⃣ 始终将 uv.lock 加入版本控制
# .gitignore 中不要忽略 uv.lock
# 确保团队成员使用完全一致的依赖版本
为什么?
因为 uv.lock 锁定了所有依赖的精确版本,保证:
你本地能跑的代码,同事拉下来也能跑。
服务器上能跑的代码,生产环境也能跑。
环境一致性,是团队协作的基石。
2️⃣ 区分生产依赖和开发依赖
uv add fastapi # 生产依赖
uv add --dev pytest # 开发依赖
这样部署时可以跳过测试相关的包,减小 Docker 镜像体积。
我们有个项目光测试依赖就 200MB,
分离后生产镜像小了一半。
构建时间也从 3 分钟降到 1 分钟。⚡
3️⃣ 善用 uv run(减少出错概率)
# 推荐:使用 uv run
uv run pytest
# 不推荐:手动激活环境
source .venv/bin/activate
pytest
特别是多环境切换时,uv run 能避免"忘激活"或"激活错环境"的尴尬。
4️⃣ 定期更新 UV
uv self update
UV 迭代很快,新版本通常会:
- 修复 bug
- 提升性能
- 支持新特性
我每个月都会更新一次,
每次都能感受到明显的速度提升。
这种持续优化的感觉,真好。😄
5️⃣ 团队统一工具链
如果团队决定使用 UV,就全员切换,避免混用导致的环境混乱。
我们团队当初是渐进式迁移的,
结果一半人用 pip,一半人用 UV,
依赖冲突炸了好几次……
后来痛定思痛,全员切 UV,世界和平了。🕊️
九、写在最后
从 pip 到 UV,我的真实感受
说实话,刚接触 UV 时我是怀疑的:
又一个新工具?学习成本值不值?
pip 虽然慢,但能用啊,为什么要换?
但真正用了一周后,我的感受是:
好的工具,能让开发者专注于业务本身,而不是和环境搏斗。
以前配环境要折腾半天:
# 旧方式(3 步)
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
# 然后等待... 等待... 等待...
现在三条命令搞定:
# 新方式(3 步,但快 10 倍)
uv init
uv add fastapi requests
uv run main.py
# 完成!✅
省下来的时间,可以用来:
- 写更多有价值的代码
- 学习新技术
- 或者……早点下班回家陪家人 😄
最后的建议
如果你还在被 Python 的包管理折磨,真心推荐试试 UV。
一旦用过,就回不去了。
不信?你现在就可以打开终端试一下:
# 1. 安装 UV(30 秒)
irm https://astral.sh/uv/install.ps1 | iex
# 2. 创建项目(5 秒)
mkdir test-uv && cd test-uv
uv init
# 3. 添加依赖(2 秒)
uv add requests
# 4. 运行脚本(1 秒)
uv run python -c "import requests; print(requests.__version__)"
# 总耗时:不到 1 分钟 ⚡
感受一下这种丝滑的体验吧。
学习资源
- 官方文档:https://docs.astral.sh/uv/
- 中文文档:https://uv.doczh.com/
- GitHub 仓库:https://github.com/astral-sh/uv
- 视频教程:B站搜索 UV 教程
- 安装指南:https://uv.doczh.com/getting-started/installation/
📖 推荐阅读
📌 写文不易,Bug 更不易。
如果这篇文章对你有帮助,可以搜一搜:空门技术栈
这里分享:
- ✅ Java / Spring AI / 企业级项目实战
- ✅ Docker / RAG知识库 / 微服务踩坑
- ✅ Python、前端、AI应用落地
- ✅ 偶尔分享一些「头发保卫战」经验 😆
一个热爱技术、持续填坑的开发者,
陪你一起少踩坑,少加班,多写优雅代码。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)