uv是一个用 Rust 编写的、速度极快的 Python 包和项目管理器
亮点
- 🚀 一个工具即可取代
pip、pip-tools、pipx、poetry、pyenv、twine、virtualenv等。 - ⚡️ 比
pip快 10-100 倍。 - 🗂️ 提供全面的项目管理,并带有通用锁文件。
- ❇️ 运行脚本,支持内联依赖元数据。
- 🐍 安装和管理 Python 版本。
- 🛠️ 运行和安装 作为 Python 包发布的工具。
- 🔩 包含一个 pip 兼容接口,以熟悉的 CLI 提供性能提升。
- 🏢 支持 Cargo 风格的工作区,适用于可扩展项目。
- 💾 磁盘空间高效,具有用于依赖项去重的全局缓存。
- ⏬ 无需 Rust 或 Python,即可通过
curl或pip安装。 - 🖥️ 支持 macOS、Linux 和 Windows。
安装方式:
[macOS 和 Linux]
curl -LsSf https://astral.sh/uv/install.sh | sh
[windows]
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
🛠️ 典型应用场景
- 日常开发:用
uv pip install极速安装依赖,替代pip install。 - 环境隔离:用
uv venv一键创建虚拟环境,替代virtualenv。
# 创建虚拟环境
uv venv #在 `.venv` 创建一个虚拟环境
uv venv my-name #在 `my-name` 创建一个虚拟环境
uv venv --python 3.11 #使用 Python 3.11 创建一个虚拟环境
#激活虚拟环境
[macOS 和 Linux]
source .venv/bin/activate
[windows]
.venv\Scripts\activate
deactivate # 退出虚拟环境
uv venv --seed # 强制安装基础包(如pip, setuptools, wheel)
- 版本管理:用
uv python install安装和管理多版本 Python,替代pyenv。 - 依赖锁定:自动生成
uv.lock,确保团队依赖一致。 例如,在 Python 项目中,通常会用requirements.txt(或pyproject.toml)记录依赖,比如你写了:
requests >= 2.20.0 #版本只要大于等于 2.20.0 就行
这种 “依赖版本不固定,会导致依赖不可重现,项目在不同环境、不同时间运行结果不一致” 的问题:
- 你本地的版本和别人不一样:你今天安装可能拿到 2.28.0,你的同事明天安装可能拿到 2.31.0(期间官方发布了新版本)。
- 新版本可能有兼容问题:
requests2.31.0 可能修改了某个接口,导致你的项目在同事电脑上运行报错,而你本地却一切正常(“我的代码明明能跑,为什么你这不行?” 的经典场景)。- 跨环境不一致:你开发环境正常,部署到服务器上时,安装了更高版本的依赖,导致线上服务故障。
uv.lock:是 uv 生成的纯文本格式锁定文件,会记录下你当前环境中,所有依赖(包括主依赖、间接依赖)的「精确版本号」、下载来源、哈希值等信息,形成一份 “依赖快照”,可以把 “模糊依赖” 变成 “精确依赖”;它确保 “所有人安装的依赖完全一致” :当其他人拿到你的项目后,只要有这份uv.lock,用 uv 安装依赖时,uv 会严格按照锁定文件中的精确版本、哈希值来安装,不会去下载任何新版本,哪怕官方已经发布了更高版本的requests;验证依赖完整性:锁定文件中的哈希值,可以验证下载的依赖包是否被篡改,避免安装恶意或损坏的包;用 uv 安装依赖后,uv 会自动生成 / 更新uv.lock,里面不会有>=、<=这种模糊符号,全是精确版本,比如:
requests = { version = "2.28.2", source = "pypi", hash = "sha256:..." }
urllib3 = { version = "1.26.14", source = "pypi", hash = "sha256:..." }
(`urllib3` 是 `requests` 的间接依赖,没手动写,但它也会被精确记录)