文章摘要

还在为 pip install 的龟速抓狂吗?还在 condavirtualenv 之间反复横跳吗?

本文带你深入了解 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

这条命令会:

  1. 自动创建 .venv 虚拟环境(如果不存在)
  2. 根据 pyproject.tomluv.lock 安装所有依赖
  3. 保证环境完全可重现

再也不用手动这三步了:

  • 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 分钟 ⚡

感受一下这种丝滑的体验吧。


学习资源


📖 推荐阅读


📌 写文不易,Bug 更不易。

如果这篇文章对你有帮助,可以搜一搜:空门技术栈

这里分享:

  • ✅ Java / Spring AI / 企业级项目实战
  • ✅ Docker / RAG知识库 / 微服务踩坑
  • ✅ Python、前端、AI应用落地
  • ✅ 偶尔分享一些「头发保卫战」经验 😆

一个热爱技术、持续填坑的开发者,
陪你一起少踩坑,少加班,多写优雅代码。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐