uv:给 Python 开发者的轻量环境管理指南
你有没有数过,为了跑通一个从 GitHub clone 下来的小项目,自己在"配置环境"这件事上浪费过多少个小时?
我记得最崩溃的一次,是一个周末下午。我兴冲冲地想试一个数据分析的小工具,结果从三点折腾到晚饭时间,Python 版本不对、pip install 报依赖冲突、好不容易装上的包又和系统自带的冲突……最后代码终于跑起来了,但我已经忘了当初想用它做什么。
这种"配置两小时,运行五分钟"的经历,我相信不止我有。Python 的环境管理工具链太散了——venv 管虚拟环境、pip 管装包(有的时候pip不出来还需要用wheel自己现造轮子)、pipx 管全局工具、pyenv 管多版本:每个工具单独看都还好,凑在一起就让人头大。更别提 conda,虽然是全集成好了,功能确实强大,但那个启动速度和体积,总让我莫名想起老学长那台装得C盘红红的黑砖ThinkPad。
后来朋友跟我推荐了 uv。说实话一开始我是抗拒的——又要学新工具?但试用了一个下午之后,我默默地把其他环境管理工具都卸了。
基础:Python 版本与项目环境
uv 是 Astral 团队出品的,就是那个用 Rust 写了 ruff 的团队。他们把 Python 生态里慢吞吞的工具用 Rust 重写一遍,然后让它快得离谱。
安装 uv 本身很简单,Windows 下一条 PowerShell 命令:
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"装好之后,首先解决 Python 版本的问题。uv 可以像 pyenv 一样管理多版本,但更加直接:
uv python install 3.11.13
uv python list没有额外的抽象层,就是下载、安装、完事。
有了 Python,就可以创建项目了。uv init 会生成一个 pyproject.toml,然后 uv venv 创建虚拟环境:
uv init my-project && cd my-project
uv venv --python 3.11.13这和传统的 python -m venv 类似,但 uv 创建环境的速度明显更快——几乎感觉不到等待。
激活环境的方式和传统 venv 相同,但需要注意平台差异:
- Windows (PowerShell):
.venv\Scripts\Activate.ps1 - Windows (CMD):
.venv\Scripts\activate.bat - macOS/Linux:
source .venv/bin/activate
Windows 用户注意:PowerShell 默认可能不允许运行脚本。如遇激活失败,可运行Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser解决,或改用 CMD 运行activate.bat。
特色:环境锁定与同步
uv 最让我放心的是它的锁定机制。传统 requirements.txt 记录的是直接依赖,但间接依赖的版本往往是模糊的。uv lock 会生成一个 uv.lock 文件,精确锁定每一个包的版本和哈希值:
uv lock团队协作时,只需共享源码和 uv.lock,对方运行 uv sync 就能得到完全一致的环境:
uv sync这让我彻底告别了"在我电脑上能跑"的尴尬。删除 .venv 后重建环境,或者在新机器上部署,都是一条命令的事。
依赖管理:add 与 uv pip
安装依赖时,uv 提供了两种方式。uv add 会把包写入 pyproject.toml,这是项目依赖的正规军:
uv add rich如果你只是临时需要一个包测试,不想污染项目配置,可以使用 uv pip install:
uv pip install requests格式和传统 pip 基本一致,但速度要快得多——特别是装一些有编译依赖的包时,这种差距尤为明显。两者的关系类似于 poetry 的 add 和 run pip,但 uv 把它们统一在了同一个工具里。
全局工具管理
除了项目环境,uv 也能管理全局 CLI 工具,替代 pipx 的角色。安装 ruff(同样是 Astral 出品):
uv tool install ruff装完之后 ruff 全局可用,与项目环境完全隔离。uv tool list 查看已安装的工具,uv tool uninstall 卸载。
实战:一个完整的 CLI 小项目
光说指令不够直观,走一个完整流程。我们来做一个极简的问候工具——输入名字,输出带彩色边框的问候语,用到 rich 库。
先准备 Python:
uv python install 3.11.13初始化项目:
uv init greeting-cli && cd greeting-cli
uv venv --python 3.11.13按需激活环境(或者用 uv run 跳过这一步):
.venv\Scripts\Activate.ps1添加依赖:
uv add rich写代码,main.py:
from rich.panel import Panel
from rich import print
name = input("请输入你的名字:")
print(Panel.fit(
f"你好,{name}!欢迎探索 uv 的世界 ✨",
title="问候",
border_style="cyan"
))运行:
uv run python main.py最后锁定环境:
uv lock写在最后
说实话,我已经不太记得清上次手动激活 Python 虚拟环境是什么时候了。uv run 解决了我最烦的那一步,而 uv add 和 uv lock 让我不用再操心依赖管理。它不是说教式地告诉你"你应该这样做",而是把最常用的操作变得足够简单,简单到你会自然地选择它。
Astral 团队似乎很擅长这个——用 Rust 把那些我们每天都在用、但用起来有点别扭的工具重写一遍,然后让它快一点、顺手一点。ruff 是这样,uv 也是这样。
如果你也受够了在终端里反复激活环境、或者看着 pip 安装进度条发呆,也许可以花一个下午试试 uv。最坏的结果,也就是卸载掉而已。但大概率,你会像我一样,默默地把其他环境管理工具都换成它。