介绍
UV 是一个现代化的 Python 包管理工具,旨在替代传统的包管理工具,如 pip
和 virtualenv
,提供更快速、高效、统一的开发体验。它的设计理念是提升包管理和虚拟环境管理的速度,并简化开发者的工作流。
UV 的主要特点:
-
高性能:
- 使用 Rust 编写,性能比传统的 Python 包管理工具(如
pip
)快 10-100 倍。 - 支持并行下载和安装包,具有智能缓存机制。
- 使用 Rust 编写,性能比传统的 Python 包管理工具(如
-
统一工具链:
- 一个命令行工具就可以完成多个任务,包括创建虚拟环境、安装包、运行脚本、添加依赖等。
- 例如,通过
uv venv
创建虚拟环境,通过uv pip install
安装包,通过uv run
运行 Python 脚本。
-
现代化的依赖管理:
- 支持
pyproject.toml
文件:pyproject.toml
文件是 Python 官方推荐的标准格式,用于描述项目的元数据和依赖关系。 - 自动生成锁定文件,保证项目的依赖一致性。
- 支持依赖组(如开发、文档、测试等依赖组),便于管理不同环境的依赖。
- 支持
-
PEP 723 支持:
- 支持在 Python 脚本中直接声明依赖,便于开发者更直观地管理依赖关系。
-
跨平台一致性:
- Windows、macOS、Linux 三大平台上有相同的使用方式,避免了跨平台的兼容性问题。
UV 的优势:
- 速度快:通过并行化和智能缓存机制,提升了包的下载和安装速度。
- 简单易用:一个命令行工具替代多个工具,减少了配置和使用的复杂性。
- 统一管理:不仅管理 Python 环境,还能管理项目依赖,简化了开发流程。
- PEP 723 支持:这种内联依赖声明方式使得 Python 脚本可以更加自包含,减少了外部依赖配置的复杂度。
使用场景:
- 适合现代开发者:对于追求效率和现代化工作流的开发者来说,
uv
是一个理想的工具。 - CI/CD 环境:对于需要快速构建和部署的持续集成/持续部署环境,
uv
提供了很好的性能支持。 - 新项目开发:推荐用于新项目,可以享受更快的包管理和虚拟环境创建体验。
适用范围:
- 推荐使用:新项目、现代 Python 开发工作流、个人项目、CI/CD 任务。
- 谨慎使用:复杂的遗留项目、企业环境(特别是需要私有源配置的场景)、对包构建有特殊要求的项目。
总结:
UV
是一个非常有前景的工具,适合于追求高效、快速的开发者。尽管它相较于 pip
和 virtualenv
还比较年轻,但它通过出色的性能和简化的工作流,提供了一个强有力的替代方案。
安装
方法一:使用安装脚本
-
macOS 和 Linux:
curl -LsSf https://astral.sh/uv/install.sh | sh
-
Windows PowerShell:
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
方法二:使用包管理器
-
macOS (Homebrew):
brew install uv
-
Windows (Scoop):
scoop install uv
通过 pip 安装
pip install uv
入门
使用虚拟环境
-
创建虚拟环境
-
创建一个新的虚拟环境:
uv venv myproject
-
创建指定 Python 版本的虚拟环境:
uv venv --python 3.11 myproject
-
激活虚拟环境:
-
Linux/macOS:
source myproject/bin/activate
-
Windows:
myproject\Scripts\activate
-
-
-
安装包
-
安装单个包:
uv pip install requests
-
安装多个包:
uv pip install requests numpy pandas
-
安装指定版本的包:
uv pip install "django>=4.0,<5.0"
-
从
requirements.txt
安装:uv pip install -r requirements.txt
-
使用 UV 方式
-
项目初始化
-
初始化一个新项目:
uv init my_uv_test cd my_uv_test
-
查看项目结构:
tree .
. ├── main.py ├── pyproject.toml └── README.md 1 directory, 3 files
-
-
使用
pyproject.toml
管理依赖[project] name = "my-uv-test" version = "0.1.0" description = "Add your description here" readme = "README.md" requires-python = ">=3.12" dependencies = []
-
依赖管理
-
安装依赖(从
pyproject.toml
):uv pip install -e .
-
安装开发依赖:
uv pip install -e ".[dev]"
-
安装所有可选依赖:
uv pip install -e ".[dev,docs,web]"
-
生成锁定文件:
uv pip freeze > requirements.lock
-
同步依赖(确保环境与
requirements.txt
完全一致):uv pip sync requirements.txt
-
-
添加依赖
-
添加生产依赖:
uv add requests uv add "django>=4.0,<5.0" uv add requests beautifulsoup4 pandas
-
添加开发依赖:
uv add --dev pytest black flake8 uv add --dev "pytest>=7.0"
-
添加可选依赖组:
uv add --group docs sphinx sphinx-rtd-theme uv add --group web fastapi uvicorn
更新后的
pyproject.toml
:[project] name = "my-uv-test" version = "0.1.0" description = "Add your description here" readme = "README.md" requires-python = ">=3.12" dependencies = [ "requests>=2.32.3", ]
-
运行
-
选择 Python 版本的优先级顺序:
-
明确指定版本(最高优先级):
uv run --python 3.11 script.py uv run --python python3.12 script.py uv run --python /usr/bin/python3.10 script.py
-
使用
pyproject.toml
或.python-version
文件:-
pyproject.toml
:[project] requires-python = ">=3.9"
-
.python-version
文件:3.11.5
-
-
设置环境变量:
export UV_PYTHON=3.11 uv run script.py
-
系统默认 Python:
uv run script.py
-
-
在没有
pyproject.toml
的情况下,uv 通过以下方式处理依赖:-
使用
--with
参数临时安装包:uv run --with requests --with pandas script.py
-
通过脚本内联声明依赖(PEP 723):
在 Python 脚本顶部添加特殊注释:# /// script # dependencies = [ # "requests", # "pandas>=1.0", # ] # ///
然后直接运行:
uv run script.py
-
使用
requirements.txt
:uv run script.py
-
完全不管理依赖:
uv 会创建一个临时的虚拟环境,只安装 Python 标准库。
-
UV 的优缺点
优点 ⭐
-
极快的速度:
- 使用 Rust 编写,比 pip 快 10-100 倍
- 并行下载和安装包
- 智能缓存机制
-
统一的工具链:
- uv 负责所有功能:创建虚拟环境、包管理、运行脚本、添加依赖
-
现代化的依赖管理:
- 支持
pyproject.toml
- 自动生成锁定文件
- 依赖组管理(如 dev, docs, test)
- 支持
-
开箱即用:
- 无需预先创建虚拟环境
-
PEP 723 支持:
- 支持在脚本内声明依赖
-
跨平台一致性:
- Windows、macOS、Linux 行为一致
缺点 ⚠️
-
生态系统兼容性:
- 某些包的构建可能有问题
- C 扩展包支持不完善
- 企业环境的私有源配置较复杂
-
学习成本:
- 新的命令和概念
- 与传统 pip/virtualenv 工作流不同
-
相对年轻:
- 社区较小,文档和教程不如 pip 丰富
-
依赖 Rust 生态:
- 某些平台缺少预编译二进制
- 从源码编译需要 Rust 工具链
适用场景
推荐使用:
- 新项目开发
- 对速度有要求的 CI/CD
- 现代 Python 开发工作流
- 个人项目和学习
谨慎使用:
- 传统企业环境
- 复杂的遗留项目
- 需要特殊包构建的项目
- 团队对新工具抗拒
总结
uv
是 Python 包管理的未来趋势,特别适合追求效率的现代开发者。虽然还有一些兼容性问题,但其速度和易用性优势明显,值得在新项目中尝试使用。