uv 现代化python环境管理
uv 从入门到上手
1. 背景
在 Python 开发中,包管理和环境隔离是每个开发者都会遇到的问题。Python 生态中的包管理工具非常多,有将 近 20 种工具,这就造成了 Python 工程化方面生态非常割裂。
了解 Python 环境管理和包管理的历史,就像在看一部“如何解决依赖地狱”的进化史。Python 社区在过去 30 年间不断在简化、规范化这些流程,但由于历史包袱,导致了现在多种工具并存的局面。
- 混沌时期:全局安装 (1990s - 2000s初)
在早期,Python 开发者通常直接将所有包安装在系统全局路径下。
- EasyInstall (2004):由 setuptools 引入,是第一个真正的 Python 包管理器。它引入了 .egg 格式,在此之前,开发者只能手动下载源码并运行
python setup.py install
- 隔离意识觉醒:Virtualenv 与 Pip (2008 - 2010)
为了解决全局冲突,隔离环境的概念慢慢诞生了
Virtualenv (2007):由 Ian Bicking 开发,允许开发者创建隔离的 Python 环境。通过创建一个包含独立 Python 解释器和独立 site-packages 目录的目录,Virtualenv 可以让开发者在一个环境中安装和运行包,而不会影响其他环境。
Pip (2008):由 Nick Coghlan 开发,是 setuptools 的替代品,提供了更简单、更强大的包管理功能。Pip 允许开发者使用
pip install命令安装包,并使用pip freeze命令生成依赖列表。关键进化:2011年,Python 核心团队通过 PEP 405 将虚拟环境官方化,并在 Python 3.3 中引入了内置的 venv 模块。
- 多元化探索:Conda 与多版本管理 (2012 - 2016)
随着数据科学的兴起,纯 Python 的包管理已经不够用了,因为很多库(如 NumPy)依赖大量的 C/C++ 或 Fortran 编译环境。
Conda (2012):Anaconda 公司推出。它不仅管理 Python 包,还管理 Python 解释器本身以及非 Python 依赖(如 OpenSSL, CUDA)。它在数据科学领域成了标准。
Pyenv (2011):解决了“一台机器安装多个 Python 版本(如 3.8 和 3.10)”的问题。
- 现代化与规范化:依赖解析与统一工具 (2017 - 至今)
现代前端开发(如 npm/yarn)的成熟倒逼 Python 社区改进。开发者开始追求确定性安装(Lockfile)。
Pipenv (2017):试图模仿 npm,将 pip 和 virtualenv 结合,引入 Pipfile.lock。虽然初期很火,但因性能和维护问题备受争议。
Poetry (2018):目前的明星工具。它使用 pyproject.toml(PEP 518 规范),提供极佳的依赖解析算法,能完美解决版本冲突,是目前专业开发者的首选。
PPDM (2020s):如 PDM。它利用了 PEP 582,尝试不再创建虚拟环境,而是像 Node.js 一样使用 pypackages 目录。
| 场景 | 推荐 |
|---|---|
| 通用 Python 开发 | Poetry + pyproject.toml |
| 科研 / 生信 / ML | Conda / Mamba + pip/poetry |
| 极致性能 / CI | uv |
| 老项目 | venv + pip |
在Poetry之前,环境管理和包安装都是分开的,效率很慢,冲突不断。uv刚出现的时候,问题不断争议不断,后续的更新完备才是软件生存之道
uv 是由 Astral 公司开发的一款 Rust 编写的 Python 包管理器和环境管理器,它的主要目标是提供比现有工具快 10-100 倍的性能,同时保持简单直观的用户体验。
uv 可以替代 pip、virtualenv、pip-tools 等工具,提供依赖管理、虚拟环境创建、Python 版本管理等一站式服务。
- A single tool to replace pip, pip-tools, pipx, poetry, pyenv, twine, virtualenv, and more
- Fast: 10-100x faster than pip, poetry, and pyenv
- Installs and manages Python versions.
- Includes a pip-compatible interface for a performance boost with a familiar CLI.
- Installable without Rust or Python via curl or pip.
- Supports macOS, Linux, and Windows.
- uv 提供了pip兼容的接口,平滑迁移到uv
2. 安装
curl -LsSf https://astral.sh/uv/install.sh | sh
powershell -ExecutionPolicy ByPass -c “irm https://astral.sh/uv/install.ps1 | iex”
pip install uv
pipx install uv
安装完成之后,使用uv --version 能够查看版本信息,表示安装成功
3. 使用
3.1 管理Python版本
uv 提供了方便的 Python 版本管理功能,可以轻松地安装、切换和管理多个 Python 版本。
使用 uv python list 命令可以查看所有python 版本(包含系统中本身安装的和uv中可安装的):
cpython-3.15.0a3-macos-x86_64-none <download available>
cpython-3.15.0a3+freethreaded-macos-x86_64-none <download available>
cpython-3.14.2-macos-x86_64-none <download available>
cpython-3.14.2+freethreaded-macos-x86_64-none <download available>
pypy-3.11.13-macos-x86_64-none <download available>
pypy-3.10.16-macos-x86_64-none <download available>
pypy-3.9.19-macos-x86_64-none <download available>
pypy-3.8.16-macos-x86_64-none <download available>
graalpy-3.12.0-macos-x86_64-none <download available>
graalpy-3.11.0-macos-x86_64-none <download available>
graalpy-3.10.0-macos-x86_64-none <download available>
graalpy-3.8.5-macos-x86_64-none <download available>
| 实现 | 一句话解释 |
|---|---|
| CPython | Python 官方参考实现,生态事实标准 |
| PyPy | 带 JIT 的 Python,实现目标是“跑得更快的 Python” |
| GraalPy | 运行在 JVM 上的 Python,面向 Java 生态 |
安装特定的版本使用uv
# 安装最新的 Python 3.12
uv python install 3.12
# 安装特定版本
uv python install 3.11.6
# 安装 PyPy 版本
uv python install pypy3.103.2 管理虚拟环境
uv设计的理念就是基于项目的,而不是基于用户,所以uv没有列出所有虚拟环境的命令,这是与conda/poetry 不同的地方
如果依赖传统的工作方式,uv也提供了简便的命令,尤其是环境的组成
虚拟环境属于项目,不属于用户
# 创建名为 .venv 的虚拟环境(默认)
uv venv
# 激活环境(macOS/Linux)
source .venv/bin/activate
# 激活环境(Windows)
.venv\Scripts\activate3.3 包管理
安装包,主要是替代和兼容pip:快速安装依赖
# 安装最新版本
uv pip install requests
# 安装特定版本
uv pip install requests==2.31.0
# 从 requirements.txt 安装
uv pip install -r requirements.txt
# add 添加删除依赖
uv add fastapi (自动创建虚拟环境并同步)
uv add --dev pytest (添加开发环境依赖)
uv remove requests
# 查看依赖树
uv tree导出依赖
# 导出当前环境的依赖
uv pip freeze > requirements.txt
# 导出生产环境依赖(排除开发依赖)
uv pip freeze --production > requirements.txt3.4 项目管理
初始化项目,管理依赖,基于 pyproject.toml 管理整个项目的生命周期。
切换到自己项目所在的目的,然后初始化
- 初始化环境
# 初始化项目
uv init- 安装依赖
然后添加依赖,添加依赖之后,会自动生成.venv文件夹
# 添加依赖
uv add requests
# 更新项目依赖
uv lock --upgrade-package requests
# 删除项目依赖
uv remove requests
项目结构如下:
├── .venv
│ ├── bin
│ ├── lib
│ └── pyvenv.cfg
├── .python-version
├── README.md
├── main.py
├── pyproject.toml
└── uv.lock
- 替代pipx:管理全局CLI工具
uv也可以全局安装,相当于安装在整个系统中,脱离环境也可以使用
# 全局安装 black 代码格式化工具(类似 pipx)
uv tool install black
uv tool run black ./myfile.py # 运行全局工具
# 同时提供更易用的 uvx 命令,类似 JavaScript 生态中的 npx
$ uvx pycowsay 'hello world!'
# 临时运行工具
uvx ruff check . (下载、运行并缓存,用完即走)