![]()
机器之心报道
编辑:Panda
uv,我们也该报道一下它了。
这个用 Rust 写的 Python 包和项目管理工具近日在 Hacker News 上再次引发广泛关注。原因很简单,来自英国的天文学家和科学传播者 Emily L. Hunt 博士在自己的博客上发布了一篇文章,称「uv 是近十年来 Python 生态系统发生的最好的事情」。
博客不长,但被分享到 Hacker News 后却引发了广泛共鸣和讨论,也收获了上千点赞(虽然很多讨论的焦点是 Rust)。
![]()
![]()
不过在看这篇博客之前,我们先简单了解一下 uv 这个项目本身。
简单来说,uv 是一个面向 Python 生态系统的高速「一体化」工具,可用于包管理、环境管理、项目初始化、工具执行、Python 版本管理等。其由 Astral(同样推出了知名工具 Ruff)开发,底层使用 Rust 语言实现,以追求极致性能。对于已有的工作流、pip、virtualenv、pipx、poetry 等工具,uv 提供极强的兼容性并且在某些场景下速度可提升 10–100 倍。
![]()
截至目前,该项目在 GitHub 已经收获了超 7.1 万 star!
![]()
项目:https://github.com/astral-sh/uv文档:https://docs.astral.sh/uv/
以下是 uv 的一些关键特性:
一款工具即可取代 pip、pip-tools、pipx、poetry、pyenv、twine、virtualenv 等众多工具。⚡️ 比 pip 快 10 到 100 倍。️ 提供完善的项目管理功能,并支持通用锁定文件(lockfile)。❇️ 可直接运行脚本,并支持内联依赖元数据。支持安装和管理多个 Python 版本。️ 可运行或安装以 Python 包形式发布的命令行工具。内置兼容 pip 的接口,在保持熟悉命令行体验的同时大幅提升性能。支持类似 Cargo 的工作区结构,轻松管理大型项目。磁盘占用高效,依赖可通过全局缓存实现去重。⏬ 无需预装 Rust 或 Python,即可通过 curl 或 pip 安装。️ 兼容 macOS、Linux 和 Windows 系统。
接下来,我们就来看看为什么说「uv 是近十年来 Python 生态系统发生的最好的事情」。
![]()
博客标题:uv is the best thing to happen to the Python ecosystem in a decade博客地址:https://emily.space/posts/251023-uv
都 2025 年了。难道安装 Python、管理虚拟环境、在同事间同步依赖,还非得那么费劲吗?
嗯... 真的不用!
最近,一款名为 uv 的杰出新工具横空出世。它彻底革新了 Python 的安装和使用方式,让一切变得无比简单。
uv 是一款免费的开源工具。它由 Astral 打造,这是一家小型创业公司,过去几年一直在持续产出优秀的 Python 工具(比如大名鼎鼎的 linter Ruff)。uv 能做到:
为你安装任意 Python 版本安装软件包管理虚拟环境极速解决依赖冲突(这对大型项目至关重要)
最棒的是,在我看来,uv 在上述所有方面都比其他任何工具做得更好。
它的速度快得惊人。它由 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 不会搞乱你现有的任何 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 软件包索引 PyPI),pyproject.toml 文件是指定发布所需全部信息的现代方式。)
用 uv 创建新项目
要用 uv 启动一个新 Python 项目,你可以运行:
uv init
这个命令会为你创建一个新项目,包含 pyproject.toml、README.md 和其他重要的模板文件。
这个命令还有很多变种,比如 uv init --bare(只创建 pyproject.toml)和 uv init --package(设置一个新的 Python 包)等等。
我建议你运行 uv init --help 来查看所有选项。
当你(已经)有了 pyproject.toml 文件
一旦你初始化了项目,或者项目里已经有了 pyproject.toml 文件,使用 uv 就变得非常简单。
你只需要在 pyproject.toml 文件所在的目录中运行:
uv sync
![]()
这个命令(实际上,如果你还没运行过,大多数 uv 命令都会)会执行以下操作:
自动安装一个有效的 Python 版本。在目录下的 .venv 文件夹中安装所有依赖,创建一个新虚拟环境。在你的目录中创建一个 uv.lock 文件。该文件会保存每个已安装包的确切、平台无关的版本。这意味着你的同事可以完全复刻你的 Python 环境。
原则上,你可以像激活其他工具创建的虚拟环境那样「激活」这个新环境。
但最「uv 风格」的使用方式,是直接在任何命令前加上 uv run。uv run 会自动为你匹配正确的虚拟环境,并用它来执行你的命令。
例如,要运行一个脚本,你不再需要:
source .venv/bin/activate
python myscript.py
你只需:
uv run myscript.py
这样做的效果是完全一样的。
同理,要使用像 Jupyter Lab 这样的「工具」,你也不需要先「激活」环境再单独运行 jupyter lab。你只需在项目目录中运行:
uv run 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
这条命令会为你(以及其他任何使用 uv 的人)将当前项目精确锁定到 Python 3.12.9 版本。
这意味着你真的可以在多台机器间复制完全一致的 Python 安装环境。
uvx:跳过以上所有步骤,立即运行工具!
但有时候,你可能只想快速运行一个工具。
比如,临时用 Ruff 检查下代码,或者在没有环境时启动一个 Jupyter notebook 服务器,甚至只是想快速启动一个装了 pandas 的 IPython 会话来打开某个文件。
uv tool 命令(它的缩写别名是 uvx)让这一切变得异常简单。
运行像下面这样的命令:
uvx ruff
uv 会自动下载你需要的工具,并在一个一次性虚拟环境中运行它。
一旦这个工具被下载过,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 了吗?对此有什么看法?
相关文章
2025-10-3014阅读
2025-10-3014阅读
2025-10-3014阅读
2025-10-3014阅读
2025-10-3014阅读
2025-10-3014阅读
2025-10-3014阅读
2025-10-3014阅读
2025-10-3014阅读
2025-10-3014阅读