在 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 绝对值得一试!
点击关注并扫码添加进交流群