大家好!我是男秀。上一期文章《uv:解放 Python 开发者的大脑内存》和大家聊了一下为什么使用uv,这一次和大家聊聊怎么使用uv,以及其常用的命令。
一、uv 是什么?为什么你需要它?
作为 Python 初学者,你一定已经接触过 pip 和 venv。pip 用来安装各种第三方库(比如 requests、numpy),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 编写,目标就是 “快” 和 **”简单”**。
它将 pip 和 venv 的功能合二为一,并提供了比它们快 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 | # 举个例子 |
之后,uv 会在当前目录下创建以下文件:
1 | ├── .python-version |
.python-version:记录了你的 Python 版本。如果你的全局环境是 Python 3.11,那么这个文件就会写入3.11。当你把项目分享给别人,或者在另一台电脑上使用时,uv会自动寻找或下载 Python 3.11 版本来创建环境,保证了环境的一致性。pyproject.toml:这是你项目的”身份证”,所有依赖包都会被记录在这里。
第二步:添加依赖包
现在,我们来安装项目需要的库。告别 pip install,迎接 uv add。
1 | uv add fastapi |
你会发现,uv 的安装速度快得惊人!几乎是瞬间完成。而且,uv 会自动将 fastapi 和 uvicorn 添加到 pyproject.toml 文件中,你再也不用手动维护 requirements.txt 了。
第三步:运行你的项目
最神奇的地方来了!你不需要手动激活虚拟环境 (source .venv/bin/activate)。直接使用 uv run 命令,它会自动找到并使用项目内的虚拟环境来执行你的脚本。
1 | # 假设你的 main.py 里写了一个 FastAPI 应用 |
之后,你的工作流就简化为:需要新包时用 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 | [tool.uv.pip] |
保存后,这个项目之后所有的 uv 命令(包括 uv add, uv sync 等)都会自动使用阿里云镜像,无需再加任何参数。将这个改动提交到 Git,整个团队都能享受到加速福利!
管理虚拟环境:uv venv
虽然 uv 大部分时候会自动管理虚拟环境,但如果你想手动操作它(比如,想激活环境后使用交互式 Shell),uv venv 就派上用场了。
1 | # 在项目目录下,创建或复用虚拟环境 |
执行后,它会确保 .venv 文件夹存在且配置正确。然后你就可以像以前一样激活它:
1 | # macOS / Linux |
激活后,你的命令行提示符前面会出现 (.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 | # requirements.txt |
你只需要把核心包(fastapi, uvicorn, pandas)重新 add 一次即可:
1 | # 假设你的核心依赖是 fastapi, uvicorn, 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,感受一下飞一般的速度吧!