我的碎碎念

不为繁华易匠心,不舍初心得始终。

0%

手把手教你用 uv:从安装到核心工作流,看这一篇就够了

大家好!我是男秀。上一期文章《uv:解放 Python 开发者的大脑内存》和大家聊了一下为什么使用uv,这一次和大家聊聊怎么使用uv,以及其常用的命令。

一、uv 是什么?为什么你需要它?

作为 Python 初学者,你一定已经接触过 pipvenvpip 用来安装各种第三方库(比如 requestsnumpy),venv 用来创建独立的 Python “工作区”(我们称之为虚拟环境),确保不同项目的依赖包互不干扰。

这套组合很经典,但有一个痛点:操作繁琐,速度偏慢

想象一下你的标准操作流程:

1、python -m venv .venv(创建虚拟环境)

2、source .venv/bin/activate(激活环境)

3、pip install requests numpy pandas (一个一个安装依赖)

4、pip freeze > requirements.txt (导出依赖列表,还得手动清理不需要的包)

每次新建项目都要重复这一套流程,不仅步骤多,而且当依赖包很多时,pip 的解析和安装速度也常常让人等到花儿都谢了。

这时候,我就非常推荐你使用uv。

uv 是由 Ruff 的作者(也就是用 Rust 大神级重写 Python Linter 的那位)推出的新一代 Python 包管理工具。它同样使用 Rust 编写,目标就是 “快” 和 **”简单”**。

它将 pipvenv 的功能合二为一,并提供了比它们快 10-100倍 的速度。用上它,你会发现原来 Python 的环境管理可以如此丝滑!

二、如何安装 uv

如果你选择uv,那么就非常简单,它本身也可以通过 pip 来安装。这就像用一把旧钥匙,去打开一扇通往新世界的大门。

无论是Windows 用户,还是 macOS / Linux 用户,在安装好Python环境后,打开你的终端或PowerShell,输入以下命令:

1
pip install uv

是的,你没看错,就这么简单!安装完成后,你可以通过以下命令来验证 uv 是否安装成功:

1
uv --version

如果你看到了类似 uv 0.6.16 的版本号输出,恭喜你,uv 已经成功安装在你的电脑上了。

三、uv的核心工作流

uv 的设计理念是让你忘记繁琐的命令,专注于代码本身。它的核心工作流非常直观:

第一步:初始化项目

当你创建好项目文件夹后,进入该目录的终端,使用 uv init 初始化。

1
2
3
4
# 举个例子
mkdir my-fastapi-project
cd my-fastapi-project
uv init

之后,uv 会在当前目录下创建以下文件:

1
2
3
4
├── .python-version
├── README.md
├── main.py
└── pyproject.toml # 现代Python项目的配置文件
  • .python-version:记录了你的 Python 版本。如果你的全局环境是 Python 3.11,那么这个文件就会写入 3.11。当你把项目分享给别人,或者在另一台电脑上使用时,uv 会自动寻找或下载 Python 3.11 版本来创建环境,保证了环境的一致性。
  • pyproject.toml:这是你项目的”身份证”,所有依赖包都会被记录在这里。

第二步:添加依赖包

现在,我们来安装项目需要的库。告别 pip install,迎接 uv add。

1
2
uv add fastapi
uv add "uvicorn[standard]" # 安装带额外功能的包

你会发现,uv 的安装速度快得惊人!几乎是瞬间完成。而且,uv 会自动将 fastapi 和 uvicorn 添加到 pyproject.toml 文件中,你再也不用手动维护 requirements.txt 了。

第三步:运行你的项目

最神奇的地方来了!你不需要手动激活虚拟环境 (source .venv/bin/activate)。直接使用 uv run 命令,它会自动找到并使用项目内的虚拟环境来执行你的脚本。

1
2
3
4
5
# 假设你的 main.py 里写了一个 FastAPI 应用
uv run uvicorn main:app --reload

# 或者,运行一个普通的 Python 脚本
uv run python main.py

之后,你的工作流就简化为:需要新包时用 uv add,运行代码时用 uv run。uv 会在后台为你打理好一切,是不是感觉无比轻松?

四、uv 常见命令详解:让你的工作流更顺滑

除了核心三步曲,uv 还提供了一些非常实用的命令,让你能更灵活地管理项目。

卸载依赖:uv remove

想删除一个不再需要的包?uv remove 就像是 uv add 的逆操作。

1
uv remove fastapi

这个命令会做两件事:

1、从当前虚拟环境中卸载 fastapi 及其相关依赖。

2、自动从 pyproject.toml 中移除该依赖记录,保证项目配置永远干净、准确。

同步环境:uv sync

这是团队协作的神器!当你的同事拉取项目代码后,只需在项目根目录运行:

1
uv sync

uv 就会读取 pyproject.toml(或 uv.lock 锁文件),像变魔术一样,极速安装所有依赖,完美复刻一个与你一模一样的开发环境。这能彻底杜绝”在我电脑上明明是好的”这类经典难题。

如果访问官方 PyPI 源(pypi.org)速度不理想,你可以在同步时临时指定一个国内的镜像源,比如阿里云。这非常简单:

1
uv sync -i https://mirrors.aliyun.com/pypi/simple/

加上 -i (或 --index-url) 参数后,uv 会在本次操作中从阿里云镜像下载所有包,速度会得到质的飞跃。

每次都手动输入 -i 参数还是有些麻烦。更推荐的做法是,直接将镜像源配置写入项目的 pyproject.toml 文件中,一劳永逸。

打开 pyproject.toml,在末尾添加以下内容:

1
2
[tool.uv.pip]
index-url = "https://mirrors.aliyun.com/pypi/simple/"

保存后,这个项目之后所有的 uv 命令(包括 uv add, uv sync 等)都会自动使用阿里云镜像,无需再加任何参数。将这个改动提交到 Git,整个团队都能享受到加速福利!

管理虚拟环境:uv venv

虽然 uv 大部分时候会自动管理虚拟环境,但如果你想手动操作它(比如,想激活环境后使用交互式 Shell),uv venv 就派上用场了。

1
2
# 在项目目录下,创建或复用虚拟环境
uv venv

执行后,它会确保 .venv 文件夹存在且配置正确。然后你就可以像以前一样激活它:

1
2
3
4
5
# macOS / Linux
source .venv/bin/activate

# Windows
.venv\Scripts\activate

激活后,你的命令行提示符前面会出现 (.venv),此时你就可以直接运行 python、pip 等命令了,它们都将指向这个独立的虚拟环境。

切换 Python 版本:uv venv -p

uv 能轻松地为项目指定并切换 Python 版本。当你需要升级项目(比如从 3.10 到 3.12)时,执行:

1
uv venv -p 3.12

uv 会自动:

1、用你系统中已安装的 python3.12 重建虚拟环境

2、自动更新 .python-version 文件内容为 3.12,将版本变更固化到配置中。

你只需将修改后的 .python-version 文件提交到 Git,团队其他成员在 uv sync 时,uv 就会自动为他们切换到正确的 Python 版本,实现无缝同步。

导出依赖:uv export

虽然 uv 很先进,但我们有时仍需与传统工具链协作。uv export 就是连接新旧世界的桥梁:

1
uv export > requirements.txt

这会生成一份标准的 requirements.txt 文件,用于部署或与其他工具集成。

当然,有导出就有导入。如果你手头有一个只使用 requirements.txt 管理的老项目,想用 uv 来接管,也非常简单。

只需要使用 uv pip install 命令来安装依赖:

1
uv pip install -r requirements.txt

不过,这样做只是安装了包,并没有将它们记录到 pyproject.toml 中。为了让项目完全由 uv 管理,推荐的做法是直接将 requirements.txt 里的核心依赖通过 uv add 添加一遍

比如,你的 requirements.txt 内容如下:

1
2
3
4
5
# requirements.txt
fastapi==0.104.1
uvicorn[standard]==0.24.0
pandas>=2.0.0
# ...后面可能还有很多子依赖

你只需要把核心包(fastapi, uvicorn, pandas)重新 add 一次即可:

1
2
# 假设你的核心依赖是 fastapi, uvicorn, pandas
uv add fastapi "uvicorn[standard]" pandas

uv 会智能解析所有子依赖并完成配置。至此,你的老项目就成功迁移到现代化的 uv 工作流了!

那么有没有更简单的方法呢?还是有的,如果你是使用macOS / Linux系统,并且你的 requirements.txt 文件很干净(没有注释、-e 等复杂行),可以尝试用下面这个命令一次性添加所有依赖:

1
uv add `cat requirements.txt`

五、总结

让我们回顾一下 uv 带来的革命性改变:

  • 极速体验:基于 Rust,无论是安装、卸载还是同步依赖,速度都远超 pip。
  • All-in-One:一个 uv 命令,同时搞定包管理 (pip) 和虚拟环境管理 (venv),甚至还包含了 pip-tools 的部分功能。
  • 智能自动化:uv add/remove 自动更新配置文件,uv run 自动使用正确的虚拟环境,让你告别繁琐的手动操作。
  • 团队友好:uv sync 轻松同步团队成员的开发环境,保证一致性。

uv 还是一个非常年轻的项目,但它的发展势头迅猛,社区活跃,其作者在 Python 工具链领域的声誉也让它备受期待。它所代表的不仅仅是一个工具,更是一种更现代、更高效的 Python 开发哲学。

还在为管理 Python 环境而烦恼吗?不妨在你的下一个个人项目中尝试一下 uv,感受一下飞一般的速度吧!

欢迎关注我的其它发布渠道