大多数 Python 开发者都在处理环境和依赖项管理工具的碎片化问题。市面上有很多工具可供使用,例如 pip、virtualenv、Poetry 和 conda。所有这些工具都有各自的结构和要求。然而,当它们组合使用时,你很快就会发现它们会使任何必要的工作流程变得复杂。而这正是 UV 能够助你一臂之力的地方,它就是你所需要的真正的 Python 包管理器。
对于那些不了解 UV 的人来说,它是一款用 Rust 编写的现代高性能 Python 包管理器。无需理会其他工具,UV 的目标是将所有这些工具的功能整合到一个只需一个终端命令即可打开的条件式体验中。UV 由 Astral 开发,旨在与 pip、virtualenv、pip-tools 和 pyenv 的各个方面进行基准测试,最终目标是成为一款速度更快的一体化依赖项和环境管理工具!
UV 是一个黑盒程序,它是一款用 Rust 编写的现代高性能 Python 包管理器和安装程序。它是 pip 等传统 Python 包管理器的直接替代品。它提供类似甚至更佳的速度、更高的可靠性以及依赖项解析的一致性。UV 旨在解决 Python 生态系统中一些最明显的痛点。漫长的安装时间、依赖项解析的陷阱以及企业级环境管理的复杂性!所有这些痛点都是 UV 的典型用例,它拥有独特的架构和周到的实现,以实现快速高效的包工作流程。它的速度比现有的包管理器快 10 到 100 倍!
UV 的目标是通过提供以下集成功能来简化常见的 Python 开发工作流程:
与传统独立运行的工具不同,UV 提供了一种统一的、“batteries-included”的 Python 开发方法。它旨在减少开发人员需要管理的工具和命令数量。
UV 的主要优势包括:
无论是处理小型个人项目还是管理大型 Python 应用程序,UV 作为 Python 包管理器都能提供强大而高效的解决方案。
开发人员在切换到新工具之前经常会问的第一个问题是“它与我目前使用的工具相比如何?”。在 Python 依赖项和项目管理领域,pip、Poetry、Conda 和 virtualenv 已经是最常用的工具。然而,UV 在当今可用的 Python 包管理器中也有其自身的优势。
下表突出显示了 UV 在现有 Python 管理工具中的排名:
在此基础上,我们将分别探讨这些工具的优缺点,并与 UV 进行比较。
Pip 和 virtualenv 一直是用于 Python 环境和包管理的独立工具。其中,pip 专门用于包管理,而 virtualenv 专门用于隔离环境。以下是它们优缺点的简要概述:
以下是 UV 明显优于 pip + virtualenv 的一些方面:
使用 pip + virtualenv 设置环境并安装软件包时,涉及:
使用 UV 时,您可以运行:
UV 通常比 pip + virtualenv 更快地完成安装,并使用生成的 lockfile 确保在不同机器上安装完全相同的软件包版本。
Conda 是一个功能强大且功能多样的环境和软件包管理器,在科学界和数据科学领域被广泛使用。它旨在支持所有软件包(不仅仅是 Python 软件包),包括对执行更复杂的科学计算工作流程至关重要的系统级依赖项和系统库。
以下是 Conda 在 Python 开发中的优缺点。
UV的优势如下:
使用 Conda 设置环境通常如下所示:
而使用 UV 时,过程如下:
Conda 是科学和数据科学项目非常强大的工具,因为它能够管理系统级软件包,并在同一环境中提供多种平台支持。然而,使用 conda 在安装速度和内存占用方面存在一些缺点,在某些情况下可能值得注意。
相比之下,UV 在安装速度、低开销以及保持 Python 生态系统是主要考虑因素的情况下尤其有用。此外,当项目没有太多非 Python 依赖项时,使用 conda 仍然非常有用且有利。
Poetry 是一款现代化的一体化 Python 软件包管理器,它以井然有序、规范的方式执行依赖项管理、项目脚手架搭建和软件包发布。
Poetry 的一些显著优势如下:
Poetry 的一些局限性包括:
以下是 UV 作为 Python 包管理器胜过 Poetry 的一些原因:
创建项目并添加 Poetry 依赖项:
Poetry 管理项目结构和环境。使用 UV,你可以在已构建的项目中安装依赖项:
UV 专注于快速安装和环境管理,无需“规定”结构化布局,因此其结构化操作非常容易逐步上手。
您已决定尝试使用 UV 作为您的下一个 Python 包管理器。这是一个明智的选择,以下是具体操作方法。
您可以在 macOS 和 Linux 上通过终端使用 curl 安装 UV:
在 Windows 上,从 PowerShell 运行它(必须以管理员权限运行):
您也可以使用 Homebrew 安装它:
支持 pip 安装,但不推荐使用。安装完成后,请检查版本是否正常:
要使用 UV 启动新项目,您需要导航到您现有的项目目录或创建新的项目目录:
例如,如果命令名为 uv init explore-uv,它将创建一个名为 explore-uv 的新项目。第一个命令将创建一个项目目录 (explore-uv),并自动创建:
UV 将创建环境和向项目添加依赖项合并到一个命令中:uv add
首次执行 uv add 命令时,UV 会在当前工作目录中创建一个新的虚拟环境,并安装您指定的依赖项。第二次运行 uv add 命令时,它将使用您现有的虚拟环境,并安装或更新您请求的新软件包。
UV 使用实时的现代依赖项解析器来管理依赖项,它会分析整个依赖关系图并查找兼容的软件包版本,以避免版本冲突。每次执行 add 命令后,UV 都会使用您安装的版本更新您的 pyproject.toml 和 uv.lock 文件,从而维护准确的记录。
要删除依赖项及其子依赖项,请运行 uv remove 命令:
安装依赖项后,您可以使用 uv run 命令运行 Python 脚本,而无需使用 python script.py 命令:
此命令确保脚本在 UV 创建的项目虚拟环境中运行。
以下是 UV 流线与 Python 版本协同工作的一些方法。
UV 可以检测您计算机上现有或已安装的 Python 版本:
此命令将显示 UV 找到的所有 Python 版本的列表,包括通过 Conda 或 Homebrew 安装的版本。
您可以随时为 UV 项目切换 Python 版本,只要新版本满足 pyproject.toml 文件中的 require-python 规范(例如,requires-python = “>=3.9”)。
设置 Python 版本:
这会将 Python 版本嵌入到 .python-version 中,并保持一致性。如果找不到请求的版本,UV 会下载并安装到 ~/.local/share/uv/python 中。然后,UV 会在项目目录中创建一个新的 venv 文件并替换旧版本。更新 Python 版本后,您可能需要重新安装依赖项:
如果遇到与“权限被拒绝”相关的错误,您可能需要使用 sudo (macOS/Linux) 或以管理员身份运行命令提示符 (Windows)。更好的选择是更改 UV 主目录的所有权:
UV 工具还提供接口来管理以命令行工具形式暴露的 Python 软件包(例如 black、flake8、pytest 等)。
Black 是一款流行的 Python 代码格式化程序,可以自动重新格式化您的代码,使其遵循一致的风格,从而提高可读性并在整个项目中保持统一的代码风格。
uv tool run 命令指示 UV 运行一个工具,black 是工具名称(Python 代码格式化程序)。hello.py 是要格式化的目标文件。此命令会在您的 hello.py 文件上运行 Black,并根据 Black 的样式规则自动对其进行格式化。
使用 uv tool run 命令:
使用更短的uvx命令:
运行这些命令时,UV 会在其缓存中创建一个临时虚拟环境,安装并运行该工具。这样,您无需在项目的虚拟环境中安装命令行工具,即可使用它们,从而提高执行速度并清理项目依赖项。清除 UV 缓存后,这些缓存环境也会自动清理,非常适合偶尔使用开发工具。
锁定文件 (uv.lock) 是 UV 依赖项管理的重要组成部分。每次运行 UV add 命令时,UV 都会创建和/或更新 uv.lock 文件。uv.lock 文件:
UV 会自动跟踪锁定文件,您应该将其签入版本控制,以确保整个开发团队的依赖项版本保持一致。
锁定文件和 requirements.txt 都处理依赖项,但它们的用途不同:
前者,即 Lock 文件,是开发的重要组成部分,因为它们有助于建立可重复的构建。requirements.txt 文件比 lock 文件简单一些,通常只包含直接依赖项,因为它们在 Python 工具中被更广泛地识别,并且可以作为与不使用 UV 的最终用户共享/部署代码的一种方式。您可以使用 UV lock 文件进行开发,并在部署时生成如下的 requirements.txt 文件来维护两者:
UV 提供了完善的依赖管理方法:
add 命令可用于更新、更改约束或指定现有依赖项的确切版本:
安装最新版本:
安装特定版本:
改变约束边界:
使依赖关系特定于平台:
可选依赖项是指核心功能不需要,但特定功能(例如 Pandas 的 Excel 或 Plot 附加功能)需要的软件包。
首先,安装核心软件包:
然后,添加其可选依赖项:
这些将在您的 pyproject.toml 中的 [project.optional-dependencies] 下列出。
依赖项组允许您组织依赖项(例如,开发、测试和文档依赖项),以将生产依赖项分开。
要将新的依赖项安装到特定组中,您可以使用 –group 标志:
用户可以使用 –group、–only-group 和 –no-group 标志来进一步控制安装哪些组。
从 pip 和 Virtualenv 迁移到 UV 几乎是无缝的。这是因为 UV 的构建遵循现有的 Python 打包标准。
如果您有一个现有项目:
接下来,您将在同一目录中启动一个新的 UV 项目:
现在您可以从需求文件安装依赖项:
以下是替换常用 pip/virtualenv 命令的快速参考:
迁移完成后,您可以安全地删除旧的虚拟环境目录。如果您发现需要回退到传统的 pip 命令,可以随时使用 UV 内置的 pip 兼容层。
UV 在众多 Python 包管理器中脱颖而出,与之前的工具相比,它提供了一种现代、快速且高效的包管理替代方案。UV 的主要优势包括:
无论您是启动一个全新的项目还是升级现有项目,UV 都是一个可靠的解决方案,可以改善您的 Python 开发工作流程。由于它与现有工具和流程兼容,因此对于希望在不中断工作流程的情况下将其开发工具链带入 21 世纪的开发者来说,这是一个轻松的决定。
作为开发者,我们生活在一个不断发展的环境中。像 UV 这样的工具就是 Rust 等现代语言如何提升开发者体验的典范。同时,它还保留了 Python 开发者所依赖的易用性和可访问性。
既然您已经了解了 UV 作为 Python 包管理器的显著优势,不妨在您的下一个项目中尝试一下。请务必查看官方 GitHub 代码库,了解最新更新或贡献。此外,请与开发社区分享您的经验,以帮助扩大 UV 的采用率并促进其未来的增强功能。
全部评论
留言在赶来的路上...
发表评论