欢迎光临
我们一直在努力

uv 从入门到精通:Python 包管理的终极形态

uv 从入门到精通:Python 包管理的终极形态

全文约 8000 字,建议收藏,按章节循序渐进阅读。

前言:为什么你需要认识 uv

先回答一个最直接的问题:我已经用 pip + venv 用得好好的,为什么要换?

来看一组数据:

操作pipuv
安装 NumPy + Pandas(无缓存) ~28 秒 ~2.3 秒
安装相同依赖(有缓存) ~12 秒 ~0.5 秒
依赖解析(复杂项目) 分钟级 毫秒级

某 AI 团队实测:CI/CD 流水线从 12 分钟缩短至 1 分 15 秒,构建效率提升 89%。

uv 由 Astral 公司(Ruff 的作者)用 Rust 编写,目标是 一把梭哈取代 pip、pip-tools、pipx、poetry、pyenv、twine、virtualenv 等一众工具。

一句话总结:它快得不像 Python 工具,但干的全是 Python 的活。

第一章:安装——三分钟搞定

1.1 官方推荐安装方式

macOS / Linux:

curl -LsSf https://astral.sh/uv/install.sh | sh

或使用 wget:

wget -qO- https://astral.sh/uv/install.sh | sh

Windows(多种方式可选):

方式一(推荐,最简洁):使用 Windows 原生包管理器 winget(Windows 11 默认自带):

winget install —id astral-sh.uv

这条命令会自动从微软商店下载安装 uv,安装完成后即可在终端中使用 uv 命令。升级同样适用此命令。

方式二(PowerShell 脚本):

powershell –ExecutionPolicy ByPass –c "irm https://astral.sh/uv/install.ps1 | iex"

也可以 pip 安装(但不推荐,因为失去了独立二进制的好处):

pip install uv

1.2 验证安装

uv –version
# 输出类似: uv 0.11.x

好的,我已将 Windows 本地配置文件方式补充到 1.3 节 中,现在该小节同时包含了**环境变量(临时)和全局配置文件(持久)**两种方式。以下是更新后的完整 1.3 节内容,您可以直接替换原文章中的对应部分:


1.3 国内镜像源配置(加速必备)

为了提升包下载速度,建议配置国内 PyPI 镜像。uv 支持两种配置方式,按需选用。

方式一:环境变量(当前会话生效)

适合临时测试或单次使用,关闭终端即失效。

Linux/macOS:

export UV_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple

可将该行添加到 ~/.bashrc 或 ~/.zshrc 中以持久化,但更推荐下面的配置文件方式。

Windows PowerShell(临时):

$env:UV_INDEX_URL="https://pypi.tuna.tsinghua.edu.cn/simple"

方式二:全局配置文件(持久生效,推荐)

配置一次,所有 uv 命令自动生效,无需重复设置。

Windows:
创建或编辑配置文件 C:\\Users\\<你的用户名>\\AppData\\Roaming\\uv\\uv.toml(如果目录或文件不存在,请手动创建),写入以下内容:

[[index]]
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
default = true

保存后,所有 uv 操作都会默认使用清华镜像源。

Linux / macOS:
配置文件位于 ~/.config/uv/uv.toml,内容与 Windows 完全相同。

提示:配置完成后,可以运行 uv debug 查看当前生效的索引地址,确认是否配置成功。如果使用 winget 安装,配置文件路径不受影响,同样有效。


第二章:核心概念——uv 到底能做什么

uv 的功能可以划分为 五个层次:

功能模块uv 实现方式替代的传统工具
包管理 uv pip install pip
虚拟环境 uv venv virtualenv/venv
依赖锁定 uv.lock 自动生成 pip-tools + requirements.txt
Python 版本管理 uv python install pyenv
命令行工具管理 uv tool install / uvx pipx

uv 默认强制使用虚拟环境——这不是缺点,是在帮你养成好习惯。

第三章:基础用法——5 个命令原地起飞

对大多数人来说,下面 5 个命令覆盖了 90% 的日常使用场景。

3.1 创建虚拟环境

# 在当前目录创建 .venv(默认名称)
uv venv

# 指定名称
uv venv my_env

# 指定 Python 版本(自动下载)
uv venv –python 3.12

uv 创建虚拟环境的速度在 0.05 秒级别,比 python -m venv 快一个数量级。

3.2 安装包(兼容 pip 语法)

# 安装到当前虚拟环境
uv pip install numpy pandas

# 从 requirements.txt 安装
uv pip install -r requirements.txt

# 安装到系统 Python(不推荐,但 CI 中可用)
uv pip install numpy –system

关键差异:uv 默认只安装在虚拟环境中,想装到系统需要显式加 –system。

3.3 运行脚本(自动管理环境)

uv run python main.py

当你执行 uv run 时,uv 会自动:

  • 检查/创建虚拟环境
  • 同步依赖(如有 pyproject.toml 和 uv.lock)
  • 在环境中执行命令
  • 你不需要手动 source activate,这是 uv 和传统工具最大的体验差异。

    3.4 查看帮助

    uv help
    uv pip –help

    3.5 激活虚拟环境(传统方式,可选)

    source .venv/bin/activate # Linux/macOS
    # .venv\\Scripts\\activate # Windows

    但有了 uv run,你几乎不需要手动激活。

    第四章:项目级管理——像 Cargo 一样管理 Python 项目

    这是 uv 最精华的部分。它把 Python 项目管理提升到了 Rust 的 Cargo 级别。

    4.1 初始化项目

    uv init myproject
    cd myproject

    生成的文件结构:

    myproject/
    ├── .gitignore
    ├── .python-version # 锁定 Python 版本
    ├── README.md
    ├── main.py # 入口文件
    └── pyproject.toml # 项目配置 + 依赖声明

    4.2 添加依赖

    uv add requests fastapi

    这会自动更新 pyproject.toml 中的依赖列表。

    pyproject.toml 示例:

    [project]
    name = "myproject"
    version = "0.1.0"
    dependencies = [
    "requests>=2.31.0",
    "fastapi>=0.104.0",
    ]

    4.3 锁定依赖(生成 uv.lock)

    uv lock

    uv lock 会解析所有依赖的精确版本,生成 uv.lock 文件。

    uv.lock 不要手动编辑,它是项目的"依赖快照",确保团队所有成员和生产环境安装完全一致的版本。

    4.4 同步环境

    uv sync

    uv sync 会根据 uv.lock 安装所有依赖到虚拟环境中。

    日常开发流程:

    uv init project
    cd project
    uv add flask sqlalchemy
    uv run python app.py # 自动 lock + sync + run

    4.5 升级依赖

    # 升级所有依赖到最新兼容版本
    uv lock –upgrade

    # 升级特定包
    uv lock –upgrade-package requests

    4.6 常用命令速查

    命令作用
    uv init 初始化新项目
    uv add <pkg> 添加依赖
    uv remove <pkg> 移除依赖
    uv lock 生成/更新锁文件
    uv sync 同步环境到锁文件状态
    uv run <cmd> 在项目环境中执行命令
    uv tree 查看依赖树

    第五章:Python 版本管理——告别 pyenv

    uv 内置了 Python 版本管理功能,可以完全替代 pyenv。

    5.1 安装 Python 版本

    # 安装最新版本
    uv python install

    # 安装指定版本
    uv python install 3.12
    uv python install 3.11 3.12 # 一次性安装多个

    # 安装 PyPy
    uv python install pypy@3.10

    5.2 查看可用/已安装版本

    uv python list

    5.3 自动下载

    uv 最智能的地方:你不需要手动安装 Python。当你执行 uv venv –python 3.12 时,如果系统没有 3.12,uv 会自动下载安装。

    5.4 项目级 Python 版本锁定

    uv init 生成的 .python-version 文件会锁定项目使用的 Python 版本,团队成员 clone 后 uv sync 会自动使用正确的版本。

    第六章:脚本运行——单文件也能优雅管理依赖

    uv 支持 PEP 723(内联依赖元数据),你可以在 Python 文件头部声明依赖。

    6.1 在脚本中声明依赖

    # /// script
    # requires-python = ">=3.9"
    # dependencies = [
    # "pandas>=2.3.3",
    # ]
    # ///

    import pandas as pd

    data = {
    "City": ["Tokyo", "Delhi", "Shanghai", "Sao Paulo"],
    "Population_Millions": [37.3, 32.0, 28.5, 22.4]
    }
    df = pd.DataFrame(data)
    print(df)

    6.2 直接运行

    uv run script.py

    uv 会自动读取脚本头部的依赖声明,创建临时环境并执行。

    6.3 用 uv add 添加脚本依赖

    uv add –script script.py pandas

    这会自动在脚本头部插入/更新依赖声明。

    适用场景:数据分析脚本、一次性任务、分享给同事的独立脚本——不需要创建完整项目,但依赖需要被管理。

    第七章:工具管理——pipx 的完美替代

    uv tool 和 uvx 用于管理 Python 命令行工具,每个工具运行在独立的虚拟环境中。

    7.1 临时运行(uvx)

    # 一次性运行,用完即焚
    uvx ruff check .
    uvx black –version
    uvx –python 3.10 ruff # 指定 Python 版本

    uvx 是 uv tool run 的别名。

    7.2 永久安装

    # 安装到 PATH,全局可用
    uv tool install ruff
    uv tool install black

    # 之后直接使用
    ruff check .

    7.3 管理已安装的工具

    uv tool list # 列出已安装的工具
    uv tool uninstall ruff # 卸载

    对比 pipx:uv 的 Rust 实现让工具安装和运行显著更快。

    第八章:高级特性

    8.1 工作区(Workspace)——多包协同开发

    灵感来自 Rust 的 Cargo workspace,适用于一个仓库包含多个关联 Python 包的场景。

    # 根目录 pyproject.toml
    [tool.uv.workspace]
    members = ["packages/*"]

    工作区的特点:

    • 每个包有自己的 pyproject.toml
    • 共享一个 uv.lock 文件,确保整个工作区依赖一致
    • 包之间可以互相引用(editable 安装)

    适用场景:核心库 + CLI 工具、微服务集合、大型 monorepo。

    8.2 缓存机制

    uv 使用激进的全局缓存来避免重复下载和构建依赖。

    缓存位置(可配置):

    • Linux: ~/.cache/uv
    • macOS: ~/Library/Caches/uv
    • Windows: %LOCALAPPDATA%\\uv\\cache

    清理缓存:

    uv cache clean

    8.3 构建和发布包

    uv 支持将项目打包并发布到 PyPI:

    # 构建分发包
    uv build

    # 发布到 PyPI
    uv publish
    # 或指定 token
    uv publish –token pypi-xxxxx

    8.4 与现有项目集成

    从 requirements.txt 迁移:

    # 1. 初始化项目
    uv init

    # 2. 从 requirements.txt 添加依赖
    uv add $(cat requirements.txt)

    # 3. 生成锁文件
    uv lock

    从 Poetry 迁移:

  • 将 pyproject.toml 中的依赖迁移到 [project.dependencies]
  • 运行 uv lock 生成锁文件
  • 更新 CI/CD 使用 uv sync 替代 poetry install
  • 从 Conda 迁移:

    # 导出 conda 环境
    conda list –explicit > conda_env.txt
    # 提取 Python 包名,用 uv add 逐个添加

    第九章:与 pip 的兼容性

    uv 被设计为 pip 和 pip-tools 工作流的 drop-in 替代品。

    9.1 兼容的命令

    几乎所有 pip 命令都可以直接加 uv 前缀使用:

    uv pip install <pkg>
    uv pip uninstall <pkg>
    uv pip list
    uv pip freeze
    uv pip show <pkg>
    uv pip install -r requirements.txt

    9.2 已知差异

    场景pipuv
    默认安装位置 当前激活的环境 强制虚拟环境(除非加 –system)
    依赖解析 顺序解析,慢 并行解析,快 10-100 倍
    多索引支持 有限 更灵活

    9.3 环境变量控制

    uv 会检测 VIRTUAL_ENV 环境变量:

    export VIRTUAL_ENV=/path/to/venv
    uv pip install numpy # 安装到指定环境

    第十章:实战场景速查

    场景 1:新项目从零开始

    uv init my_api
    cd my_api
    uv add fastapi uvicorn
    uv add –dev pytest black # 开发依赖
    uv run uvicorn main:app –reload

    场景 2:克隆团队项目后

    git clone <repo>
    cd <repo>
    uv sync # 一键搞定:创建环境 + 安装所有依赖
    uv run pytest # 直接跑测试

    场景 3:跑一个数据分析脚本

    # script.py 头部声明了 pandas 依赖
    uv run script.py # 自动处理环境

    场景 4:CI/CD 流水线(追求极致速度)

    # GitHub Actions 示例
    – name: Install uv
    run: curl -LsSf https://astral.sh/uv/install.sh | sh
    – name: Sync dependencies
    run: uv sync –frozen # 不更新锁文件,直接用
    – name: Run tests
    run: uv run pytest

    场景 5:安装全局 CLI 工具

    uv tool install ruff
    uv tool install httpie

    第十一章:常见问题与避坑指南

    Q1:uv 和 Poetry 怎么选?

    • uv 更快:依赖解析比 Poetry 快 8 倍
    • uv 更轻:单二进制 ~10MB,Poetry 需要 Python 环境
    • Poetry 更成熟:插件生态更丰富,打包发布流程更完善
    • 结论:新项目无脑 uv;已有 Poetry 项目可暂不迁移,但新功能开发建议规划迁移

    Q2:uv 能替代 conda 吗?

    不能完全替代。conda 擅长管理非 Python 依赖(CUDA、MKL、OpenBLAS)。纯 Python 项目用 uv,需要 CUDA 的深度学习项目用 conda + uv 混合使用。

    Q3:uv pip install 和 uv add 有什么区别?

    • uv pip install:只安装包,不记录到 pyproject.toml
    • uv add:安装包并写入 pyproject.toml 依赖列表

    日常开发用 uv add,临时调试用 uv pip install。

    Q4:缓存占空间怎么办?

    uv cache clean # 清理所有缓存
    uv cache prune # 只清理未使用的缓存

    Q5:–locked、–frozen、–no-sync 的区别:

    选项行为
    –locked 锁文件过期则报错,不自动更新
    –frozen 使用锁文件但不检查是否过期
    –no-sync 不检查环境是否同步

    Q6:winget 安装后 uv 命令找不到怎么办?(Windows 新增)

    winget 默认将程序安装在 %LOCALAPPDATA%\\Programs\\uv\\ 目录,如果该目录不在 PATH 中,可手动添加到系统环境变量。或重启终端后再次尝试,通常 winget 会自动处理 PATH 注册。

    总结:2026 年,你应该用 uv

    你的情况建议
    新项目 直接用 uv,从 uv init 开始
    在用 venv + pip 渐进迁移:先用 uv pip 替代 pip,再引入项目级管理
    在用 Poetry 保持,但新功能模块可以试用 uv
    数据科学(需要 CUDA) uv + conda 混合使用
    CI/CD 必须换 uv,速度提升肉眼可见

    uv 不是"又一个 Python 工具",它是 Python 工具链的范式转移。从 Rust 实现到强制虚拟环境,从自动依赖解析到内联脚本依赖,uv 在设计上解决了传统工具积累二十年的痛点。

    2026 年不用 uv,约等于 2020 年不用黑屏终端。

    开始吧(Windows 用户可以直接 winget 安装):

    # macOS / Linux
    curl -LsSf https://astral.sh/uv/install.sh | sh

    # Windows (Windows 11 推荐)
    winget install –id astral-sh.uv

    验证安装:

    uv –version

    Happy Coding! 🐍⚡

    赞(0)
    未经允许不得转载:171主机测评 » uv 从入门到精通:Python 包管理的终极形态
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址