Rust 开发的高性能 Python 包管理工具,可替换 pip、pip-tools 和 virtualenv

最近,我在 Python 潮流周刊 中分享了一个超级火爆的项目,这还不到一个月,它在 Github 上已经拿下了 8K star 的亮眼成绩,可见其受欢迎程度极高!国内还未见有更多消息,我趁着周末把一篇官方博客翻译出来了,分享给大家。

作者:@charliermarsh

译者:豌豆花下猫@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 的实现也遵循我们的核心产品原则:

  1. 痴迷于高性能

在上述基准测试中,uv 在没有缓存的情况下比 pip 和 pip-tools 快 8-10 倍,而在有热缓存的情况下(例如,重新创建虚拟环境或更新依赖项),则快 80-115 倍。

uv 使用全局模块缓存来避免重新下载和构建依赖项,并在支持的文件系统上利用 Copy-on-Write 和硬链接来最小化磁盘空间使用。

  1. 优化以便于采用

尽管我们对 Python 打包的未来有着宏大的愿景,但 uv 的初始版本聚焦于支持我们 uv pip 接口背后的 pip 和 pip-tools,使其可以零配置地被现有项目所采用。

相似地,uv 可以“仅仅”当作一个解析器(uv pip compile 锁定你的依赖项),“仅仅”当作一个虚拟环境创建器(uv venv),“仅仅”当作一个包安装器(uv pip sync),等等。它既是统一的,又是模块化的。

  1. 简化的工具链

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 runuv 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 打包成为可能所做的所有工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/723006.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

请说明Vue中的解耦能力

Vue中的解耦能力是指在Vue框架中,我们能够有效地将代码分离成独立的组件或模块,使得这些组件之间的依赖关系减少,实现高内聚、低耦合的设计目标。利用Vue中的组件化开发,可以让不同的模块之间更容易地通信和协作,提高代…

【小白学机器学习7】相关系数R,决定系数R2和SST=SSR+SSE, 离差,偏差,方差,标准差,编译系数,标志误。

目录 1 各种数据指标,分类整理 1.0 关于数据/值有3种 1.1 第1类:描述一堆数据特征的指标:集中度,离散度,形状特征 1.2 第2类:判断预测y值和观测值差距的指标 1.3 第3类:描述误差的各种指标…

无线地勘答题模板

(三)无线网络配置 CII集团公司拟投入13万元(网络设备采购部分),项目要求重点覆盖楼层、走廊和办公室。平面布局如图1所示。 图1 平面布局图 1.绘制AP点位图(包括:AP型号、编号、信道等信息,其中信道采用2.4G的1、6、11三个信道进行规划)。 2.使用无线地勘软件,输出…

html标签之表格标签,程序员必看

突破困境: 1. 提升学历 前端找工作,学历重要吗? 重要。谁要是告诉你不重要那一定是在骗你。现实情况是大专吃紧,本科够用,硕士占优,大专以下找到工作靠运气和 戳这里领取完整开源项目:【一线大…

【力扣经典面试题】14. 最长公共前缀

目录 一、题目描述 二、解题思路 三、解题步骤 四、代码实现(C版详细注释) 五、总结 欢迎点赞关注哦!创作不易,你的支持是我的不竭动力,更多精彩等你哦。 一、题目描述 编写一个函数来查找字符串数组中的最长公共前缀。…

微软研究深度报告:Sora文转视频AI模型全景剖析及未来展望

论文由微软研究团队撰写,这篇论文深入探讨了Sora的发展背景、核心技术、新兴应用场景、现有的局限性以及未来的发展机会,基于公开资料和团队自行进行的逆向工程分析。文中详尽且逻辑清晰,建议细读全文以获得深入了解。 原文:Sora…

第四节 JDBC简单示例代码

本文章教程中将演示如何创建一个简单的JDBC应用程序的示例。 这将显示如何打开数据库连接,执行SQL查询并显示结果。 这个示例代码中涉及所有步骤,一些步骤将在本教程的后续章节中进行说明。 创建JDBC应用程序 构建JDBC应用程序涉及以下六个步骤 - 导…

Java并发编程-进程和线程

一、进程和线程 1. 进程 什么是进程? 简单来说,进程就是程序的一次启动和执行。进程是操作系统中的一个概念,它代表正在运行的程序的实例。每个进程都有自己的内存空间、代码和数据,以及其他操作系统资源,如文件和设备…

Git分布式管理-头歌实验远程版本库

Git的一大特点就是,能为不同系统下的开发者提供了一个协作开发的平台。而团队如果要基于Git进行协同开发,就必须依赖远程版本库。远程版本库允许,我们将本地版本库保存在远端服务器,而且,不同的开发者也是基于远程版本…

力扣hot100:560.和为K的子数组(前缀和+哈希表)

分析: 这个题目乍一看,数据大小用暴力解法大概率会超时,可能想用双指针,但是问题出现在 可能存在负数,也就是说即使是找到了一个答案,后面也可能存在负数和正数抵消,又是答案,因此不…

SpringBoot集成Logback

logback logback-core:其它两个模块的基础模块。logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。logback-access:访问模块与Servlet容器集成提供…

08-prometheus监控的告警通知-alertmanager组件工具

一、概述 prometheus通过规则文件对比抓取到的数据,来判断是否触发告警,我们通过配置告警的工具altermanager进行告警通知; 规则文件,写的就是,当我们获取到的PromeQL的值到达一个设置的规则后,触发告警&am…

刷题笔记day27-回溯算法3

39. 组合总和 var path []int var tmp []int var result [][]int// 还是需要去重复,题目中要求的是至少一个数字备选的数量不同。 // 所以需要剪枝操作,右边的要比左边的> func combinationSum(candidates []int, target int) [][]int {// 组合问题pa…

白皮书发布|超融合运行 K8s 的场景、功能与优势

目前,不少企业都使用虚拟化/超融合运行 Kubernetes 和容器化应用。一些用户可能会有疑惑:既然 Kubernetes 可以部署在裸金属上,使用虚拟化不是“多此一举”吗? 在电子书《IT 基础架构团队的 Kubernetes 管理:从入门到…

详细分析Vue中的$refs用法

目录 1. 基本知识2. Demo 1. 基本知识 在Vue.js中,$refs是一个特殊的属性,用于在组件内部直接访问子组件或者DOM元素 作用: 访问DOM元素: 直接访问模板中的DOM元素,以便执行DOM操作,如聚焦、改变样式等 访…

[极客大挑战 2020]Roamphp1-Welcome ---不会编程的崽

buuctf上的题难度适中。越到后边会越难&#xff0c;但也有例外 页面报错了。报错的原因可能有很多种猜想。所以有没有一种可能是故意这么设计的。先抓包吧 发现是GET请求。修改请求方法再试试呢&#xff1f; <?php error_reporting(0); if ($_SERVER[REQUEST_METHOD] ! P…

Android Studio开发(一) 构建项目

1、项目创建测试 1.1 前言 Android Studio 是由 Google 推出的官方集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门用于开发 Android 应用程序。 基于 IntelliJ IDEA: Android Studio 是基于 JetBrains 的 IntelliJ IDEA 开发的&#xff0c;提供了丰富的功能和插件…

Python 全栈系列232 再次搭建RabbitMQ

说明 最近想重新上RabbitMQ&#xff0c;主要目的还是为了分布式任务调度。在Kafka和RabbitMQ两者犹豫了一下&#xff0c;还是觉得RabbitMQ好一些。 在20年的时候有搞过一阵子的RabbitMQ,看了下当时的几篇文章&#xff0c;觉得其实想法一直没变过。 Python - 装机系列24 消息…

常用“树”数据结构

哈夫曼树 在许多应用中&#xff0c;树中结点常常被赋予一个表示某种意义的数值&#xff0c;称为该结点的权。从树的根到任意结点的路径长度(经过的边数)与该结点上权值的乘积&#xff0c;称为该结点的带权路径长度。树中所有叶结点的带权路径长度之和称为该树的带权路径长度&am…

出现身份验证错误,无法连接到本地安全机构 顺利解决这个问题希望能帮助大家

出现身份验证错误&#xff0c;无法连接到本地安全机构&#xff0c;远程计算机&#xff1a;XX&#xff0c;这可能是由于密码过期&#xff0c;如果密码已过期请更新密码。 我们可以在系统属性中对远程进行设置&#xff0c;以解决远程桌面无法连接到本地安全机构这一问题。 步骤…