Py学习  »  Python

王炸神器!它是 Python 生态近十年来最棒的工具。网友:用了就停不下来

程序员的那些事 • 4 周前 • 263 次点击  

【导读】:uv 是 Astral 公司推出的免费开源工具,堪称十年来 Python 生态的重大突破。它以 Rust 编写,速度超快且跨平台,能轻松搞定 Python 版本安装、包管理、虚拟环境搭建及依赖冲突解决等核心需求。uv 安装仅需一行命令,不影响现有 Python 环境,安全易用。

英文作者是一位来自英国天文学家 Emily Hunt,这篇文章是程序员节那天 HN 的热榜头条,引发热议。

uv 是 Python 生态近十年来最棒的工具

Article header image.

现在是 2025 年。安装 Python、管理虚拟环境、与同事同步依赖项,真的还必要搞得那么麻烦吗?

其实 duck 不必!有一个名为 uv 的牛叉新工具,它彻底改变了 Python 的安装和使用体验,让其变得无比轻松。

uv 是一款免费开源工具,由初创公司 Astral 开发。这家小公司过去几年持续推出优秀的 Python 工具(例如出色的 linter Ruff)。

uv 可以:

  • 为你安装任何版本的 Python
  • 安装软件包
  • 管理虚拟环境
  • 极快地解决依赖冲突(对于大型项目至关重要

最重要的是,在我看来,它在上述所有方面都超越了其他任何工具。它速度快得惊人,由 Rust 编写,并且几乎可以在任何操作系统或平台上运行。

安装 uv

uv 的安装过程非常简单。有多种方法,但我认为最简单的是这个一行命令——对于 Linux 和 Mac 是:

curl -LsSf https://astral.sh/uv/install.sh | sh

或者在 Windows 的 PowerShell 中:

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

之后你就可以使用 uv 命令来调用 uv 了。

安装 uv 不会干扰你现有的任何 Python 安装——它是一个独立的工具,所以可以放心安装试用。

为项目管理 Python

为任何 Python 项目使用虚拟环境始终是个好主意。它可以将不同的代码和依赖项隔离开来。根据我的经验,尽早养成使用虚拟环境的习惯可以省去很多麻烦。uv 天然就使用虚拟环境,所以如果你开始使用 uv,就能很轻松地用上虚拟环境。

uv 会根据你工作目录(或其父目录)中的 pyproject.toml 文件为你构建 Python 环境。pyproject.toml 文件是一种标准的现代格式,用于指定 Python 项目的依赖项。一个基础的 pyproject.toml 文件可能类似这样:

[project]
name = "my_project"
version = "1.0.0"
requires-python = ">=3.9,<3.13"
dependencies = [
  "astropy>=5.0.0",
  "pandas>=1.0.0,<2.0",
]

本质上,它只需要指定使用哪个 Python 版本以及一些依赖项。加上项目名称和版本号也是个好主意。

(旁注:对于要发布为包的项目,例如发布到 pip 和 uv 使用的 Python Package Index, pyproject.toml 文件是一种现代方式,用于指定发布包所需的所有信息。)

用 uv 创建新项目

要使用 uv 启动一个新的 Python 项目,可以运行:

uv init

这将为你创建一个新项目,包含 pyproject.tomlREADME.md 和其他重要的样板文件。

这个命令有很多不同的运行方式,比如 uv init --bare(只创建 pyproject.toml),uv init --package(设置一个新的 Python 包)等等。我建议运行 uv init --help 来了解更多信息。

当你已经/如果已经有一个 pyproject.toml 文件时

一旦你初始化了一个项目——或者如果你的项目中已经有一个  pyproject.toml 文件——开始使用 uv 就非常简单了。你只需要在 pyproject.toml 文件所在的目录中运行:

uv sync

这个命令(事实上,大部分 uv 命令,如果你之前没运行过的话)会:

  1. 自动安装一个有效版本的 Python
  2. 将所有依赖项安装到目录中的新虚拟环境 .venv 里
  3. 在你的目录中创建一个 uv.lock 文件,该文件保存了每个已安装软件包的精确的、与平台无关的版本——这意味着其他同事可以完全复现你的 Python 环境。

原则上,你可以像激活其他工具中常见的虚拟环境一样“激活”这个新虚拟环境,但最“uv 风格”的使用方式简单地在任何命令前加上 uv run。这个命令会自动为你选取正确的虚拟环境并在其中运行你的命令。例如,要运行一个脚本——与其用:

source .venv/bin/activate
python myscript.py

不如直接:

uv run myscript.py

效果是一样的。同样地,要使用像 Jupyter Lab 这样的“工具”,你只需在项目目录中运行:

uv run jupyter lab

而不必先“激活”环境再单独运行 jupyter lab

添加依赖项

你总是可以手动编辑 pyproject.toml 文件:uv 会检测到更改并重建项目的虚拟环境。但 uv 也提供了更简便的方法来添加依赖项——你可以直接运行:

uv add numpy>=2.0

来添加一个包,包括指定版本约束(如上述命令)。这个命令会自动为你编辑 pyproject.toml uv add 在添加来自 git 或计算机上其他位置的远程依赖项方面也非常强大(但此处不赘述)。

固定 Python 版本

最后,我认为 uv 最有用的功能之一是为你的项目固定特定的 Python 版本。运行:

uv python pin 3.12.9

将为当前项目精确固定使用 Python 3.12.9,对于其他使用 uv 的协作者也是如此——这意味着你真的可以在多台机器上复现完全相同的 Python 安装。

uvx:忽略以上所有,立即运行一个工具!

但有时候,你可能只是想快速运行一个工具——比如用 Ruff 来检查某处代码,或者在没有环境的情况下启动 Jupyter notebook 服务器,甚至只是快速启动一个安装了 pandas 的 IPython 会话来打开一个文件。uv tool 命令(有一个简短的别名 uvx)让这变得异常简单。运行像这样的命令:

uvx ruff

会自动下载你想要使用的工具并在一个一次性的虚拟环境中运行它。因为 uv 使用了缓存,一旦这个工具之前被下载过,后续操作就会非常快。

有很多场合我可能会想这么做——一个常见的情况是快速启动一个安装了 pandas 的 IPython 会话(使用  --with 来添加依赖项),以便我能快速打开并查看一个 parquet 文件。例如:

uvx --with pandas,pyarrow ipython

或者,也许只是启动一个 Jupyter Lab 服务器,以便我能快速打开学生发给我的 Jupyter notebook:

uvx jupyter lab

老实说,还有很多其他奇怪的、一次性的使用场景,有 uvx 在身边真的很好。我再也不觉得总是使用虚拟环境会错过什么了,因为 uvx 在你需要时总能给你一张“免死金牌”。

如果这还没说服你:个人使用体会

我最初是在去年发现 uv 的,当时正与其他可爱的开发者一起构建 The Astrosky Ecosystem:一个为在线天文学家构建开源社交媒体集成的精彩项目。但在多个开发者使用多种操作系统进行异步协作时,管理 Python 安装很快变成了一项繁重的任务。

uv 对我们来说是一个极其强大的简化工具,我们在整个技术栈中都使用它。作为开发者,我们都可以在完全相同的 Python 安装环境下工作,这一点尤其重要,因为我们使用的一些半实验性依赖项每个版本都有破坏性变更。在 GitHub Actions 上,我们计划使用 uv 来快速构建 Python 环境并运行单元测试。在生产环境中,uv 已经为我们所有的服务器管理 Python。

能始终知道 Python 和软件包安装会在我们所有的机器上始终如一地、正确地处理,这种感觉 真是太棒了这就是为什么 uv 是 Python 生态近十年来发生的最好的事情。

了解更多

uv 官方文档:https://docs.astral.sh/uv/


网友留言

这个帖子在 HackerNews 引发热议,1300+ 留言。

ederamen 留言

uv 太棒了。我对采用新工具通常很保守,带着很多怀疑尝试了 uv,但它在各方面都更优秀。即使它没有那么完善和可靠,其原始速度也让你很难再回到其他工具。

hardwaregeek 留言

我必须承认,听到 Python 开发者们终于尝到了 npm/cargo/bundler 这类工具的甜头后欣喜若狂,我感觉这些年的坚持被证明了——过去总有人说 Python 的 virtualenv 加 pip 就挺好,JavaScript 那边的工具肯定更差。没错,npm 是有毛病,但锁文件和稳定的安装体验实在太棒了。

seabrookmx 留言

完全同意。我们之前一直用 pyenv+poetry 组合,经常得把 poetry 版本锁定在特定版本——因为新版 poetry 在解析依赖时动不动就卡住。 pyenv 也很麻烦,你得搭配各种系统包才能确保编译出的 Python 具备所需功能,我们团队又有 MacOS 和 Linux 开发者,这个问题经常让人头疼。

uv 不仅速度远超这两个工具,命令行体验也更人性化,完美解决了我刚说的两个问题。

希望 Astral 推出的类型检查器能足够优秀,我们现在用 mypy 简直是折磨——速度慢还一堆 bug。

sanskarix 留言

最让我对 uv 感到兴奋的不仅仅是速度提升,而是它展示了现代开发者工具的一个关键原则:减少摩擦绝不意味着剥夺选择权。

我一直在关注关于以项目为中心和以环境为中心的工作流程的讨论,我认为 UV 实际上对这两种模式都支持得很好。对于 @BrenBarn 提到的“不断摸索直到有所成果”的工作流程,你完全可以用 uv venv playground 创建一个通用环境,然后使用 uv pip install 逐步构建你的实验性依赖项。项目结构可以稍后再说。

有趣的是,uv 的速度使得在这些方法之间切换的成本几乎为零。想快速隔离测试某些东西?启动一个临时环境。想把一个实验正式化为一个项目?迁移过程是无痛的。

这反映了我工具链其他部分看到的情况——像前端开发的 Vite 或现代 Docker 实践这样的工具都遵循这种“默认快速,需要时灵活”的模式。当你的整个工具链都遵循这一原则时,效率的提升是复合增长的。

Aerhardt 留言

我很惊讶地发现,我如此喜欢在所有命令前加 "uv" 而不是激活环境——当然,如果你喜欢,激活环境仍然是一个可选项。

我也喜欢它能非常轻松地管理 Python 版本。一切感觉都非常“开箱即用”,但又局限于项目本地。

我使用它的时间还不够长,无法判断它是否能避免那不可避免的、每年两次的“调试 Python 环境日”,但它已经展现出足够的潜力,让我在所有新项目中都将其作为标准。


(参考:news.ycombinator.com/item?id=45751400,中文经由 AI 大模型优化)

- EOF -

推荐阅读  点击标题可跳转

0、哈哈!台湾投诚 APP 火了,还能一键呼叫解放军…

0、山姆改版遭差评轰炸!会员怒喷:开除 X 里系高管。山姆连夜行动…

1、特朗普:英伟达顶级 AI 芯片仅供美国使用,禁止向中国和其他国家供应

2、刘强东:从此在老婆面前没有了自信

3、马斯克:五六年后不再有手机和 App

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/189025