uv 深度解析:Python 包、项目与解释器管理指南
uv 是 Astral 用 Rust 打造的下一代 Python 包管理器:整合包安装、依赖锁定、虚拟环境、隔离工具与 Python 版本管理。本文深度讲解 uv 的核心用法。
直接回答:uv 是 Ruff 团队的第二个爆款:用 Rust 重写 Python 包管理全链——装包(pip)、锁依赖(pip-tools)、虚拟环境(virtualenv)、全局工具(pipx)、Python 版本(pyenv)一个二进制全包,可减少多工具切换,但并非与所有既有工具和配置完全等价。
为什么 uv 这么快
uv 使用 Rust 实现、缓存和并行操作降低部分工作负载的开销。缓存链接方式会因平台、文件系统和配置而异;冷缓存、网络与源码构建仍会影响耗时,本文不提供未经验证的速度倍率。
安装
curl -LsSf https://astral.sh/uv/install.sh | sh
# macOS 也可 brew install uv
uv 不需要预装 Python——它自己就能下载管理 Python 版本。
pip 风格接口:先核对兼容性
uv venv # 建虚拟环境
uv pip install requests # 装包(常用语法类似 pip,并非完整替代)
uv pip compile requirements.in -o requirements.txt # 锁定
uv pip sync requirements.txt # 精确还原
迁移前核对索引认证、pip 配置读取、构建隔离和解析差异;uv 不直接读取 pip.conf 或全部 PIP_* 环境变量。
项目模式:现代工作流
uv init myapp && cd myapp
uv add requests # 加依赖(自动写 pyproject + 更新 lock)
uv add --dev pytest # 开发依赖
uv run python main.py # 在项目环境里运行(免激活)
uv lock && uv sync # 锁定与同步
uv tree # 依赖树
uv.lock 可记录跨平台解析结果及环境标记;不同操作系统、Python 版本和平台 wheel 仍可能安装不同构件,不能保证逐位相同。部署时用 uv sync --locked --no-dev 检查锁文件与配置一致,并固定解释器和系统依赖。
依赖分组
uv add --group test pytest pytest-cov
uv add --group lint ruff
uv sync --locked --no-default-groups # 不安装默认开发组;也不显式启用 test/lint
分组写进 pyproject.toml 的 [dependency-groups](PEP 标准),比 requirements-dev.txt 的散装时代体面得多。
Python 版本管理
uv python install 3.13 # 安装
uv python pin 3.13 # 项目锁定(.python-version)
uv python list # 查看
多版本并存、项目自动切换——pyenv 的职责 uv 顺手接管了。
全局工具
uv tool install ruff # 隔离安装 CLI 工具(pipx 的角色)
uv tool run black --check . # 临时运行
uvx ruff check . # run 的缩写,一次性的最爱
迁移建议
- 个人脚本/老项目:先评估
uv pip的兼容差异,再迁移; - 新项目:
uv init直接上项目模式; - Poetry/PDM 存量:转换工具专属依赖、分组、索引和构建设置,重新生成 uv.lock,并验证构建产物和测试;不能只替换锁文件。
常见问题(FAQ)
Q:uv 稳定吗,敢上生产?
A:可将固定 uv 版本、受控索引与经过审查的锁文件用于部署流程,但生产适用性仍需检查兼容性、构建可重复性及升级回归,不以流行度替代验证。
Q:和 Conda 冲突吗?
A:两者作用范围不同,但混合管理同一环境可能让依赖记录不一致。明确由谁管理哪些包,避免相互覆盖;科学计算依赖复杂时优先用一套可重建的环境规范。
Q:公司内网/私有源支持吗?
A:支持。可在 pyproject 的 [[tool.uv.index]] 配置索引并按官方认证方式注入凭据;UV_DEFAULT_INDEX 设置默认索引,旧 UV_INDEX_URL 为兼容接口,额外源、认证、离线模式都有对应开关。
官方参考
本文基于官方文档整理,未进行运行时或性能测试。示例中的业务函数、数据模型和部署地址需结合项目补全;局部片段不等同于完整生产应用。