在 Python 包管理工具层出不穷的今天,pip
、pip-tools
、poetry
、conda
等各有千秋。而今天要介绍的 uv
,则是一款由 Astral 团队推出、采用 Rust 编写的全新工具,目标直指成为 “Python 的 Cargo”。它不仅在性能上表现优异,而且在功能和易用性上都为开发者提供了一站式的解决方案。
1. uv 的亮点
与传统工具相比,uv 在以下几个方面脱颖而出:
-
极速安装
得益于 Rust 的高性能,uv 在处理依赖安装时速度快得惊人,远超其他同类工具。 -
一体化体验
uv 不仅能高效管理包依赖,还能自动构建和管理虚拟环境、协调 Python 版本,从项目初始化到依赖同步都能轻松应对。 -
开源且社区有力支持
采用 MIT 许可发布,背靠 Astral 的技术实力与资本支持,无论是新手还是老手,都能快速上手,并期待未来更多功能的拓展。
使用 uv,就像使用 Node.js 或 Rust 中的依赖管理工具一样简单直观,助你专注于代码本身,而非琐碎的环境配置。
2. uv 的安装方式
安装 uv 非常便捷,官方提供了多种安装方法,既可以直接运行安装脚本,也可以通过 pip 安装。示例如下:
# macOS 与 Linux 用户可运行:
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows 用户可在 PowerShell 中执行:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
# 或者通过 pip 安装:
pip install uv
安装完成后,可以使用以下命令检查 uv 是否成功安装:
3. uv 的实际应用
使用 uv 管理 Python 项目不仅简化了环境搭建,也让依赖管理变得前所未有的简单。以下将通过几个实际案例展示 uv 的常见用法。
3.1 项目初始化
在 uv 的世界中,创建一个项目只需简单创建一个文件夹,然后用 uv init
命令初始化项目。该命令会自动生成一些默认文件,包括:
- pyproject.toml:记录项目的基本信息、依赖版本和支持的 Python 版本。
- uv.lock:用于锁定所有依赖(及其传递依赖),确保跨平台安装一致性。
- 示例代码:一个简单的
hello.py
文件,便于验证环境配置。
$ uv init myproject
Initialized project `myproject` at `D:\projects\python\myproject`
$ cd myproject
$ ls
目录: D:\projects\python\myproject
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2025/03/24 12:06:08 109 .gitignore
-a---- 2025/03/24 12:06:08 5 .python-version
-a---- 2025/03/24 12:06:08 87 hello.py
-a---- 2025/03/24 12:06:08 155 pyproject.toml
-a---- 2025/03/24 12:06:08 0 README.md
打开 hello.py
,你会看到类似如下的示例代码:
def main():
print("Hello from myproject!")
if __name__ == "__main__":
main()
同时,pyproject.toml
文件中记录了项目名称、版本、描述以及所需 Python 版本等基本信息。
提示:项目初始化后,uv 自动将项目纳入 Git 版本管理,方便后续协作与版本追踪。
3.2 环境同步与运行
项目创建完成后,第一步就是同步项目依赖。uv 会自动检测或下载适合的 Python 版本,并在项目目录下创建虚拟环境,同时生成完整的依赖锁定文件 uv.lock
。
$ uv sync
Using CPython 3.12.4 interpreter at: D:\miniconda3\envs\databook\python.exe
Creating virtual environment at: .venv
Resolved 1 package in 15ms
Audited in 0.05ms
依赖同步完毕后,即可用 uv 直接运行项目:
$ uv run .\hello.py
Hello from myproject!
无需再依赖传统的 python hello.py
命令,uv 为你提供了统一的项目运行入口。
3.3 管理依赖
依赖管理是 uv 的核心功能之一。添加、更新或删除依赖均可通过 uv 命令轻松完成。例如,安装 pandas 包:
$ uv add pandas
Resolved 7 packages in 3.41s
Prepared 6 packages in 4.63s
Installed 6 packages in 1.80s
+ numpy==2.2.1
+ pandas==2.2.3
+ python-dateutil==2.9.0.post0
+ pytz==2024.2
+ six==1.17.0
+ tzdata==2024.2
安装后,uv.lock
文件将自动记录所有新增的依赖及其传递依赖。你可以在项目的 pyproject.toml
中看到相应的依赖分组,例如:
[project]
name = "myproject"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = []
[dependency-groups]
# 默认依赖、开发依赖或生产依赖均可通过不同分组管理
在移除依赖时,uv 也会自动删除不再需要的传递依赖,确保依赖树的干净整洁。
$ uv remove pandas
Resolved 1 package in 12ms
Uninstalled 6 packages in 1.18s
- numpy==2.2.1
- pandas==2.2.3
- python-dateutil==2.9.0.post0
- pytz==2024.2
- six==1.17.0
- tzdata==2024.2
再次运行项目时,如果依赖已被移除,将会提示找不到模块,从而帮助你及时调整依赖配置。
3.4 区分开发与生产环境
uv 也支持类似 Node.js 或 Rust 中的依赖分组管理,你可以根据项目需求将依赖划分为开发环境和生产环境。如下示例展示了如何分别为开发和生产环境添加依赖:
$ uv add --group dev pandas
Resolved 7 packages in 1.72s
Installed 6 packages in 1.39s
+ numpy==2.2.1
+ pandas==2.2.3
+ python-dateutil==2.9.0.post0
+ pytz==2024.2
+ six==1.17.0
+ tzdata==2024.2
$ uv add --group production requests
Resolved 12 packages in 2.72s
Prepared 5 packages in 1.31s
Installed 5 packages in 68ms
+ certifi==2024.12.14
+ charset-normalizer==3.4.1
+ idna==3.10
+ requests==2.32.3
+ urllib3==2.3.0
在 pyproject.toml
文件中,会自动生成类似如下的配置,清晰区分不同环境下的依赖关系:
[project]
name = "myproject"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = []
[dependency-groups]
dev = [
"pandas>=2.2.3",
]
production = [
"requests>=2.32.3",
]
4. 后记
随着 uv 不断迭代更新,其功能将愈加完善。未来版本中,uv 有望支持构建和发布 Python 包到 PyPI,并进一步优化跨平台支持和性能表现。可以预见,uv 将在简化 Python 项目管理、提高开发效率方面发挥越来越重要的作用,助力开发者专注于核心业务逻辑。