比光速还快?用 Rust 编写的 Python 包管理工具

科技   2024-09-01 23:41   广东  

在 Python 的世界里,包管理一直是一个让人又爱又恨的话题。pip 作为默认的包管理器,虽然简单易用,但速度一直为人诟病。各种替代方案层出不穷,如 pip-tools, pipx, poetry, pyenv, virtualenv 等等,每个工具都试图解决 pip 的某些痛点,但却也带来了新的问题,例如学习曲线陡峭、功能重叠等等。

今天,我们要介绍一款全新的 Python 包管理工具 uv,它以其惊人的速度和强大的功能,试图终结这场旷日持久的包管理之战。

uv:速度与激情的完美结合

uv 是一款用 Rust 编写的 Python 包和项目管理工具,它不仅速度比 pip 快 10-100 倍,还整合了众多现有工具的功能,致力于成为 Python 开发者的终极武器。

uv 的核心优势

  • 速度飞快: uv 使用 Rust 编写,并针对性能进行了极致优化,在安装依赖项、创建虚拟环境等方面,比 pip 快 10-100 倍。
  • 功能全面: uv 不仅可以替代 pip 进行包管理,还可以管理 Python 版本、运行和安装 Python 应用、管理项目依赖、运行单文件脚本等,集成了 pip, pip-tools, pipx, poetry, pyenv, virtualenv 等工具的功能。
  • 易于使用: uv 提供了与 pip 兼容的接口,用户可以无缝切换,无需改变现有的工作流程。
  • 跨平台支持: uv 支持 macOS, Linux 和 Windows 三大操作系统。
  • 高效的缓存机制: uv 使用全局缓存来存储依赖项,避免重复下载,节省磁盘空间。
  • 强大的项目管理功能: uv 支持 Cargo 风格的工作区,方便开发者管理大型项目。
  • 支持单文件脚本: uv 可以管理单文件脚本的依赖项和环境,并支持在脚本中内联声明依赖项元数据。

uv 功能详解

项目管理

uv 可以像 rye 或 poetry 一样管理项目依赖和环境,支持 lockfiles, workspaces 等功能。

$ uv init example
Initialized project `example` at `/home/user/example`

cd example

$ uv add ruff
Creating virtualenv at: .venv
Resolved 2 packages in 170ms
   Built example @ file:///home/user/example
Prepared 2 packages in 627ms
Installed 2 packages in 1ms
 + example==0.1.0 (from file:///home/user/example)
 + ruff==0.5.4

$ uv run ruff check
All checks passed!

工具管理

uv 可以像 pipx 一样执行和安装 Python 包提供的命令行工具。

# 在临时环境中运行工具
$ uvx pycowsay 'hello world!'
Resolved 1 package in 167ms
Installed 1 package in 9ms
 + pycowsay==0.0.0.2

# 安装工具
$ uv tool install ruff
Resolved 1 package in 6ms
Installed 1 package in 2ms
 + ruff==0.5.4
Installed 1 executable: ruff

$ ruff --version
ruff 0.5.4

Python 版本管理

uv 可以安装多个 Python 版本,并方便开发者在不同版本之间切换。

# 安装多个 Python 版本
$ uv python install 3.10 3.11 3.12
Searching for Python versions matching: Python 3.10
Searching for Python versions matching: Python 3.11
Searching for Python versions matching: Python 3.12
Installed 3 versions in 3.42s
 + cpython-3.10.14-macos-aarch64-none
 + cpython-3.11.9-macos-aarch64-none
 + cpython-3.12.4-macos-aarch64-none

# 按需下载 Python 版本
$ uv venv --python 3.12.0
Using Python 3.12.0
Creating virtualenv at: .venv
Activate with: source .venv/bin/activate

# 在当前目录中使用特定 Python 版本
$ uv python pin pypy@3.11
Pinned `.python-version` to `pypy@3.11`

脚本支持

uv 可以管理单文件脚本的依赖项和环境,并支持在脚本中内联声明依赖项元数据。

# 创建一个新脚本,并添加内联元数据声明其依赖项
echo 'import requests; print(requests.get("https://astral.sh"))' > example.py

$ uv add --script example.py requests
Updated `example.py`

# 在隔离的虚拟环境中运行脚本
$ uv run example.py
Reading inline script metadata from: example.py
Installed 5 packages in 12ms
<Response [200]>

pip 兼容接口

uv 提供了与 pip, pip-tools 和 virtualenv 等常用命令兼容的接口,用户可以无缝切换,无需改变现有的工作流程,并体验 10-100 倍的速度提升。

# 将 requirements.in 编译成平台无关的 requirements.txt
$ uv pip compile docs/requirements.in \
   --universal \
   --output-file docs/requirements.txt
Resolved 43 packages in 12ms

# 创建虚拟环境
$ uv venv
Using Python 3.12.3
Creating virtualenv at: .venv
Activate with: source .venv/bin/activate

# 安装锁定的 requirements.txt
$ uv pip sync docs/requirements.txt
Resolved 43 packages in 11ms
Installed 43 packages in 208ms
 + babel==2.15.0
 + black==24.4.2
 + certifi==2024.7.4
 ...

总结

uv 是一款功能强大、速度飞快的 Python 包管理工具,它整合了众多现有工具的优点,并以其简洁易用的接口和跨平台支持,为 Python 开发者带来了前所未有的流畅体验。如果你正在寻找一款能够解决所有包管理难题的终极武器,那么 uv 绝对值得一试!

文章精选

Tailspin:用 Rust 打造的炫彩日志查看器

Rust: 重塑系统编程的安全壁垒

Youki:用Rust编写的容器运行时,性能超越runc

使用C2Rust将C代码迁移到Rust

Rust语言中如何优雅地应对错误


Rust编程笔记
与你一起在Rust的世界里探索、学习、成长!
 最新文章