你有没有数过,为了跑通一个从 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/Linuxsource .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 的 addrun 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 adduv lock 让我不用再操心依赖管理。它不是说教式地告诉你"你应该这样做",而是把最常用的操作变得足够简单,简单到你会自然地选择它。

Astral 团队似乎很擅长这个——用 Rust 把那些我们每天都在用、但用起来有点别扭的工具重写一遍,然后让它快一点、顺手一点。ruff 是这样,uv 也是这样。

如果你也受够了在终端里反复激活环境、或者看着 pip 安装进度条发呆,也许可以花一个下午试试 uv。最坏的结果,也就是卸载掉而已。但大概率,你会像我一样,默默地把其他环境管理工具都换成它。