Rust 开发的高性能 Python 包管理工具,可替换 pip、pip-tools 和 virtualenv
最近,我在 Python 潮流周刊 中分享了一个超级火爆的项目,这还不到一个月,它在 Github 上已经拿下了 8K star 的亮眼成绩,可见其受欢迎程度极高!国内还未见有更多消息,我趁着周末把一篇官方博客翻译出来了,分享给大家。
译者:豌豆花下猫@Python猫
英文:uv: Python packaging in Rust (https://astral.sh/blog/uv)
声明:本翻译是出于交流学习的目的,为便于阅读,部分内容略有改动。转载请保留作者信息。
摘要
uv 是一个极其快速的 Python 包安装器和解析器,用 Rust 编写,旨在作为 pip 和 pip-tools 工作流的替代品。
它代表了我们追求“Python 的 Cargo”的里程碑:一个全面、快速、可靠且易于使用的 Python 项目和包管理器。
作为此次发布的一部分,我们还将接管 Rye,这是 Armin Ronacher 开发的一个实验性 Python 打包工具。我们将维护它,直到我们将 uv 扩展成统一的后继项目,以实现我们对 Python 打包的共同愿景。
在 Astral,我们为 Python 生态系统构建高性能的开发工具。我们最出名的是 Ruff,一个极其快速的 Python linter 和格式化工具。(译注:对 Ruff 的介绍 性能最快的代码分析工具,Ruff 正在席卷 Python 圈!)
今天,我们发布了 Astral 工具链中的下一个工具:uv,一个用 Rust 开发的高性能的 Python 包解析器和安装器。

图注:使用热缓存来解析(左)和安装(右)Trio 依赖项,以模拟重新创建虚拟环境或向现有项目添加依赖项
uv 旨在作为 pip、pip-tools 和 virtualenv 的直接替代品,现在就可以用于生产环境中那些围绕这些工作流构建的项目。
产品原则
与 Ruff 一样,uv 的实现也遵循我们的核心产品原则:
- 痴迷于高性能
在上述基准测试中,uv 在没有缓存的情况下比 pip 和 pip-tools 快 8-10 倍,而在有热缓存的情况下(例如,重新创建虚拟环境或更新依赖项),则快 80-115 倍。
uv 使用全局模块缓存来避免重新下载和构建依赖项,并在支持的文件系统上利用 Copy-on-Write 和硬链接来最小化磁盘空间使用。
- 优化以便于采用
尽管我们对 Python 打包的未来有着宏大的愿景,但 uv 的初始版本聚焦于支持我们 uv pip 接口背后的 pip 和 pip-tools,使其可以零配置地被现有项目所采用。
相似地,uv 可以“仅仅”当作一个解析器(uv pip compile 锁定你的依赖项),“仅仅”当作一个虚拟环境创建器(uv venv),“仅仅”当作一个包安装器(uv pip sync),等等。它既是统一的,又是模块化的。
- 简化的工具链
uv 作为一个单一的静态二进制文件发布,能够替代 pip、pip-tools 和 virtualenv。uv 没有直接的 Python 依赖,因此你可以跟 Python 本身分别安装,避免了在多个 Python 版本(例如,pip vs. pip3 vs. pip3.7)之间选择 pip 安装程序。
安装使用
虽然 uv 将演变成一个完整的 Python 项目和包管理器(“Cargo for Python”),但像pip-tools 这样较狭窄的聚焦范围,让我们得以解决构建此类工具所涉及的低级问题(如包安装),同时立即提供有用的东西,最小化社区的使用障碍。
你可以通过我们的独立安装程序安装 uv,或者从 PyPI 安装。
使用 curl:
curl -LsSf https://astral.sh/uv/install.sh | sh
对 Windows:
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
使用 pip 或 pipx:
pip install uv
pipx install uv
uv 能满足你对现代 Python 打包工具的所有期望:可编辑安装、Git 依赖项、URL 依赖项、本地依赖项、约束文件、源码分发、自定义索引等,所有这些都设计成与你现有的工具无缝兼容。
uv 支持 Linux、Windows 和 macOS,并已针对公共的 PyPI 索引进行了大规模测试。
本文首发于 Python猫,博客:https://pythoncat.top/posts/2024-03-05-uv
即插即用的兼容性 API
这个初始版本主要实现了 uv 的pip 命令。对于使用过 pip 和 pip-tools 的人来说,这将会很熟悉:
- 类似于
pip install,运行uv pip install,可从命令行、requirements 文件或 pyproject.toml 来安装 Python 依赖项 - 类似于
pip-compile,运行uv pip compile来生成锁定的 requirements.txt - 类似于
pip-sync,运行uv pip sync来同步带有锁定的 requirements.txt 的虚拟环境
通过将这些“低级”命令放在uv pip下,我们在 CLI 中预留了空间,用于我们打算在未来发布的更“有主见”的项目管理 API,它看起来将更像 Rye、Cargo 或 Poetry。(想象一下 uv run 、uv build 等等)
uv 也可以通过uv venv 作为虚拟环境管理器使用。它比python -m venv 快大约 80 倍,比virtualenv 快 7 倍,且不依赖于 Python。

图注:创建一个虚拟环境,有(左)和没有(右)pip 及 setuptools 种子包
uv 的虚拟环境符合标准,可以与其他工具互换使用——没有锁定机制或定制。
新功能
从头开始构建我们自己的包管理工具栈,这还为新功能开辟了空间。例如:
- uv 支持替换解析策略。 默认情况下,uv 遵循标准的 Python 依赖解析策略,即优先选择每个包的最新兼容版本。但通过传入
--resolution=lowest,库作者可以测试他们的包与依赖项的最低兼容版本。(这类似于 Go 的最小版本选择。) - uv 允许针对任意 Python 目标版本进行解析。 pip 和 pip-tools 默认针对当前安装的 Python 版本进行解析(例如,在 Python 3.12 下运行,将生成兼容于 Python 3.12 的解析),uv 支持
--python-version参数,使你能够在运行较新版本的情况下,生成兼容较低版本(例如 Python 3.7)的解析。 - uv 允许依赖项“覆盖”。 uv 通过覆盖(
-o overrides.txt)将 pip 的“约束”概念向前推了一步,允许用户通过覆盖包的声明依赖项来引导解析器。覆盖为用户提供了一个逃生舱口,用于解决错误的上限和其他错误声明的依赖项。
在当前形式下,uv 并不适合所有项目。pip 是一个成熟且稳定的工具,支持非常广泛的场景,并且专注于兼容性。虽然 uv 支持 pip 的大部分功能,但它缺乏对一些传统特性的支持,比如 .egg 分发。
同样,uv 目前还不支持生成与平台无关的锁定文件。这与 pip-tools 相符,但与 Poetry 和 PDM 不同,这使得 uv 更适合围绕 pip 和 pip-tools 工作流构建的项目。
对于那些深入打包生态系统的人来说,uv 还用 Rust 实现了符合标准的更多功能,例如 PEP 440(版本标识符)、PEP 508(依赖项说明符)、PEP 517(与构建系统无关的构建前端)、PEP 405(虚拟环境)等。
"Python 的 Cargo":uv 和 Rye
uv 代表着我们追求 "Python 的 Cargo" 的一个中间里程碑:一个统一的 Python 包和项目管理器,它极其快速、可靠且易于使用。
想象一下:一个单一的二进制文件,它可为你安装 Python,并为你提供使用 Python 所需的一切,不仅包括 pip、pip-tools 和 virtualenv,还有 pipx、tox、poetry、pyenv、ruff 等等。
使用 Python 工具链可能是一种低信心体验:为新项目或现有项目搭建环境需要大量的工作,而且命令通常以令人费解的方式报错。相比之下,在 Rust 生态中做事时,你信任工具会成功。Astral 工具链的目标是将 Python 从低信心体验转变为高信心体验。
我们对 Python 打包的愿景与 Rye 的愿景相去不远,Rye 是由 Armin Ronacher 开发的一个实验性的项目与包管理工具。
在与 Armin 的交流中,我们清楚地认识到我们的愿景非常接近,但实现这些愿景需要在基础工具上作大量投入。例如:构建这样的工具需要一个非常快速的、端到端集成的、跨平台的解析器和安装器。在 uv 里,我们已经构建出了这样的基础工具。
我们认为这是一个难得的合作机会,可以避免 Python 生态破碎。因此,我们与 Armin 合作,很高兴地接管了 Rye。 我们的目标是将 uv 发展成一个生产就绪的 "Python 的 Cargo",并在适当的时候提供一个将 Rye 平滑迁移到 uv 的路径。
在此之前,我们将维护 Rye,将其迁移成在幕后使用 uv,宽泛地说,它将成为我们正在构建的最终用户体验的实验性测试床。
虽然合并项目带来了一些挑战,但我们致力于在 Astral 的旗帜下构建一个单一的且统一的工具,并在我们发展 uv 成为一个合适且全面的继任者的同时,支持现有的 Rye 用户。
我们的路线图
在此次发布之后,我们的首要任务是支撑好那些在考察 uv 的用户,重点是提高跨平台的兼容性、性能和稳定性。
然后,我们将着手把 uv 扩展为一个完整的 Python 项目与包的管理器:一个单一的二进制文件,为你提供使用 Python 提高生产力所需的一切。
我们对 uv 有一个雄心勃勃的路线图。但在当下,我认为它对 Python 来说,感觉像是提供了一种非常不同的体验。我希望你们能尝试一下。
致谢
最后,我们要感谢所有直接或间接为 uv 的开发做出贡献的人。其中最重要的是 pubgrub-rs 的维护者 Jacob Finkelman 和 Matthieu Pizenberg。uv 使用了 PubGrub 作为其底层版本解析器,我们感谢 Jacob 和 Matthieu 在过去对 PubGrub 所做的工作,以及他们作为合作者对整个项目的关键助力。
我们还要感谢那些启发了我们的打包项目,尤其是 Cargo,以及来自 JavaScript 生态的 Bun、Orogene 和 pnpm,以及来自 Python 生态的 Posy、Monotrail 和 Rye。特别感谢 Armin Ronacher 与我们合作完成这项工作。
最后,我们还要感谢 pip 的维护者们以及更广泛的 PyPA 的成员,感谢他们为使 Python 打包成为可能所做的所有工作。
Rust 开发的高性能 Python 包管理工具,可替换 pip、pip-tools 和 virtualenv的更多相关文章
- python 包管理工具
python 包管理工具 Python当前的包管理工具链是 easy_install/pip + distribute/setuptools + distutils,显得较为混乱. 而将来的工具链组合 ...
- Python 包管理工具解惑
Python 包管理工具解惑 本文链接:http://zengrong.net/post/2169.htm python packaging 一.困惑 作为一个 Python 初学者,我在包管理上感到 ...
- Python包管理工具和多版本环境管理
1. Python包管理工具 在安装Python包的过程中,经常涉及到distutils.setuptools.distribute.setup.py.easy_install.easy_instal ...
- 转载:Python 包管理工具解惑
Python 包管理工具解惑 本站文章除注明转载外,均为本站原创或者翻译. 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商: 本站部分原创和翻译文章提供m ...
- Python包管理工具小结
此文已由作者张耕源授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 作为一名接触Python有一段时间的初学者,越来越体会到Python的方便之处,它使人能更 多的关注业务本身 ...
- python包管理工具他们之间的关系
python包管理工具之间的关系 现在的python包管理工具有很多,非常混乱,必须理清他们之间的关系才能更好的使用python构建强大的包关系系统工具. 首先:python官方推荐的第三方库是PyP ...
- Python | Pipenv官方推荐的python包管理工具
原文地址:https://cloud.tencent.com/developer/article/1355672 Pipenv - 官方推荐的的python包管理工具. Pipenv是一款旨在将所有包 ...
- 【rust】Rust 的构建系统和包管理工具Cargo认识并初步使用(2)
Cargo 是 Rust 的构建系统和包管理工具,同时 Rustacean 们使用 Cargo 来管理它们的 Rust 项目.Cargo 负责三个工作:构建你的代码,下载你代码依赖的库并编译这些库.我 ...
- Python包管理工具pip的基本使用
1.简介 pip 是一个Python包管理工具,主要是用于安装 PyPI 上的软件包,可以替代 easy_install 工具. 2.pip安装 如果你安装的Python 2 >=2.7.9 或 ...
- [转载]Python 包管理工具
[转载]Python 包管理工具 最近由于机缘巧合,使用各种方法安装了一些Python包,所以对Python的包管理开始感兴趣.在网上找到一篇很好的文章:https://blog.zengrong.n ...
随机推荐
- 离开页面关闭video标签
<video src="./play.mp4" id="maskmore_1" controls="controls" autopla ...
- 在cmd(命令行)或bat文件切换盘符
bat文件 写一个自动更新git的bat文件,如果bat文件放在E盘,想要去到D盘的某个目录下执行命令,代码如下: SET ksf=D:\code\KSFramework @echo on d: cd ...
- 菜鸟教程-所有软件教学都有【python、java、c、c++、html、sql、css、jquery、bootstrap、vue、c#、go】
软件教学[python.java.c.c++.html.sql.css.jquery.bootstrap.vue.c#.go] 首页 https://www.runoob.com/ 资料很全 1.p ...
- 2.1 C++ STL 数组向量容器
Vector容器是C++ STL中的一个动态数组容器,可以在运行时动态地增加或减少其大小,存储相同数据类型的元素,提供了快速的随机访问和在末尾插入或删除元素的功能. 该容器可以方便.灵活地代替数组,容 ...
- 天玑9300大战骁龙8 Gen3:十余项数据实测 到底谁才是安卓之王?
一.前言:全大核天玑9300正面硬钢骁龙8 Gen3 究竟谁才是安卓芯片之王? 今年,两家移动芯片厂商都开始放大招了,骁龙首发Cortex-X4超大核,联发科也不甘示弱,初次将"全大核&qu ...
- 关于laravel路由无法访问(nginx)
laravel路由无法访问 被这个问题折腾了 好几次了,记录一下希望可以帮到后面的朋友 在laravel路由中配置好了之后无法访问的问题有可能是因为在本地服务配置的问题(我使用的是nginx服务器) ...
- MarkDown文件插入图片(绝对\相对路径\调整图像大小位置)
1. 插入网络图片(有效网络连接) Markdown中插入图片的语法为,图片路径可以直接写入图片有效链接网址即可: 方法1: 方法2:<img src=&quo ...
- Navicat 15 for MySQL 破解【我亲测可用】
1.去官网下载正版 https://www.navicat.com.cn/ 2.破解下载:https://files-cdn.cnblogs.com/files/del88/NavicatKeygen ...
- Oracle-创建用户不带C##(Oracle 19c)
由于oracle从12c开始引入了容器(PDB和CDB).租户的概念.直接连接sysdba用户创建新用户时,会默认在CDB中创建公有用户,用户名需要以"C##"或"c## ...
- 借助 .NET 开源库 Sdcb.DashScope 调用阿里云灵积通义千问 API
在昨天的博文中,我们通过 Semantic Kernel 调用了自己部署的通义千问开源大模型,但是自己部署通义千问对服务器的配置要求很高,即使使用抢占式按量实例,每次使用时启动服务器,使用完关闭服务器 ...