天行健,君子以自强不息;地势坤,君子以厚德载物;

使用UV替代PIP

文章背景

在 AIGC 快速发展的今天,ComfyUI 已成为 AI 图像生成领域的重要工具。然而,作为一个复杂的 AI 应用,它依赖着庞大的 Python 生态系统 —— PyTorch、transformers、diffusers、numpy、pillow 等数百个包,总安装体积动辄数 GB。

痛点场景:每当开发者需要创建新的调试房间或重建环境时,漫长的依赖安装过程就成了效率杀手。想象一下,你刚有了新的创意想法,却要先等待 15-20 分钟的包安装时间,这种体验实在糟糕。

工作实践:在主导公司内部的"ComfyUI 调试房间启动速度优化"项目时,我发现了 uv 这个神器。通过将传统的 pip + virtualenv 方案替换为 uv,我们实现了令人震撼的性能提升:

优化成果一览

  • • 房间启动速度: 从 150 秒骤降至 60 秒,用户等待时间减少 60%
  • • 依赖安装效率: 大型包安装从 15-20 分钟压缩到 2-3 分钟,效率提升 5-8 倍
  • • 环境创建速度: 虚拟环境创建从 30 秒优化到 3 秒,快了 10 倍
  • • 存储空间节约: 全局缓存机制避免重复下载,节省 70% 磁盘空间
  • • 开发体验革新: 支持频繁的环境重建,让敏捷开发成为现实

为什么写这篇文章:这次优化项目的成功让我意识到,uv 不仅仅是一个工具升级,更是 Python 开发工作流的一次革命。相信每个被 pip 安装速度折磨过的开发者,都能在 uv 中找到解脱。

让我们一起探索这个来自 Rust 世界的 Python 包管理神器!另外如果你对 AI 内容创作也感兴趣,赶紧关注我的公众号然后找我内推吧!

概述

uv 是由 Astral(Ruff 的创建者)开发的现代化 Python 包和项目管理器,用 Rust 编写。它旨在成为一个单一工具来替代 pippip-toolspipxpoetrypyenvtwinevirtualenv 等多个工具。

uv vs mise:两种现代化工具的对比

在之前的文章中,我介绍了 mise(原 rtx)作为多语言版本管理工具。现在有了 uv,很多人会疑惑这两个工具有什么区别。让我们来详细对比一下:

相同点

  1. 1. 现代化设计: 两者都是用 Rust 编写的现代化工具,性能优异
  2. 2. 简化工作流: 都致力于简化开发者的日常工作流程
  3. 3. 配置文件驱动: 都支持通过配置文件管理项目设置
  4. 4. 活跃维护: 都有活跃的开源社区和频繁的更新

不同点

特性
uv
mise
主要定位
Python 包管理和项目管理
多语言版本管理工具
支持语言
专注 Python 生态
支持 Python、Node.js、Ruby、Go 等多种语言
版本管理
Python 版本管理 + 包管理
专精于多语言版本管理
项目管理
完整的 Python 项目生命周期
主要负责运行时版本切换
包管理
内置高性能包管理器
依赖各语言的原生包管理器
虚拟环境
内置虚拟环境管理
不直接管理虚拟环境
依赖锁定
提供 uv.lock 锁定文件
不涉及依赖锁定
性能优化
专门针对 Python 包安装优化
专门针对版本切换优化

使用场景建议

选择 uv 的场景:

  • • 专注于 Python 开发
  • • 需要高性能的包管理
  • • 希望统一的项目管理工具
  • • 对依赖安装速度有高要求

选择 mise 的场景:

  • • 多语言项目开发
  • • 需要在不同项目间频繁切换语言版本
  • • 团队使用多种编程语言
  • • 希望统一的版本管理体验

两者结合使用:
实际上,uv 和 mise 可以很好地配合使用:

# 使用 mise 管理 Python 版本
mise use python@3.11

# 使用 uv 进行包管理和项目管理
uv init my-project
uv add requests

这样可以享受到 mise 优秀的版本管理能力和 uv 卓越的包管理性能。

主要特性

  • • 单一工具: 替代多个传统 Python 工具
  • • 极速性能: 比 pip 快 10-100 倍
  • • 项目管理: 提供通用锁定文件的综合项目管理
  • • 脚本运行: 支持内联依赖元数据的脚本执行
  • • Python 版本管理: 安装和管理 Python 版本
  • • 工具运行: 运行和安装以 Python 包发布的工具
  • • 兼容接口: 包含与 pip 兼容的接口
  • • 工作区支持: 支持 Cargo 风格的工作区
  • • 高效存储: 全局缓存实现依赖去重
  • • 跨平台: 支持 macOS、Linux 和 Windows

安装方法

官方安装脚本(推荐)

macOS 和 Linux:

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

Windows:

powershell -c "irm https://astral.sh/uv/install.ps1 | iex"

其他安装方式

使用 pip:

pip install uv

使用 Homebrew (macOS):

brew install uv

使用 Conda:

conda install -c conda-forge uv

项目管理

创建新项目

# 初始化一个新项目
uv init my-project
cd my-project

# 查看项目结构
ls -la
# 输出:
# pyproject.toml
# README.md
# src/
# .python-version

添加依赖

# 添加运行时依赖
uv add requests numpy pandas

# 添加开发依赖
uv add --dev pytest black ruff

# 添加可选依赖组
uv add --optional test pytest pytest-cov
uv add --optional docs sphinx

# 添加特定版本的依赖
uv add "django>=4.0,<5.0"

运行项目

# 在项目环境中运行 Python 脚本
uv run python main.py

# 运行特定命令
uv run pytest

# 运行带参数的命令
uv run python -m pytest tests/

锁定和同步

# 生成锁定文件
uv lock

# 同步环境与锁定文件
uv sync

# 仅同步生产依赖
uv sync --no-dev

# 同步特定依赖组
uv sync --extra test

脚本管理

创建和运行脚本

# 创建一个脚本文件
cat > script.py << 'EOF'
#!/usr/bin/env python3
"""
A simple script that demonstrates uv script dependencies.
"""
# /// script
# requires-python = ">=3.8"
# dependencies = [
#     "requests>=2.25.0",
#     "rich>=10.0.0",
# ]
# ///

import requests
from rich.console import Console
from rich.table import Table

def main():
    console = Console()
    console.print("Hello from uv script!", style="bold green")
    
    # 使用依赖包
    response = requests.get("https://httpbin.org/json")
    
    table = Table(title="Response Data")
    table.add_column("Key", style="cyan")
    table.add_column("Value", style="green")
    
    for key, value in response.json().items():
        table.add_row(str(key), str(value))
    
    console.print(table)

if __name__ == "__main__":
    main()
EOF

# 运行脚本(uv 会自动处理依赖)
uv run script.py

为现有脚本添加依赖

# 为脚本添加依赖元数据
uv add --script existing_script.py requests beautifulsoup4

工具管理

运行工具(临时)

# 使用 uvx 在临时环境中运行工具
uvx cowsay "Hello uv!"

# 运行 HTTP 服务器
uvx --from http-server http-server

# 运行特定版本的工具
uvx --from "black==23.1.0" black --version

安装工具(持久)

# 安装工具到全局环境
uv tool install black
uv tool install ruff
uv tool install httpx

# 安装特定版本
uv tool install "black==23.1.0"

# 列出已安装的工具
uv tool list

# 升级工具
uv tool upgrade black

# 卸载工具
uv tool uninstall black

Python 版本管理

安装 Python 版本

# 安装特定 Python 版本
uv python install 3.11
uv python install 3.12
uv python install 3.13

# 安装多个版本
uv python install 3.10 3.11 3.12

# 列出可用版本
uv python list --only-installed

# 列出所有可用版本
uv python list

使用特定 Python 版本

# 为当前目录固定 Python 版本
uv python pin 3.11

# 使用特定版本运行命令
uv run --python 3.12 python --version

# 创建指定版本的虚拟环境
uv venv --python 3.11

pip 兼容接口

uv 提供了与 pip 兼容的命令接口,可以作为 pip 的直接替代品:

虚拟环境管理

# 创建虚拟环境
uv venv

# 创建指定名称的虚拟环境
uv venv myenv

# 激活虚拟环境(需要手动激活)
source .venv/bin/activate  # Linux/macOS
# 或
.venv\Scripts\activate  # Windows

包安装和管理

# 安装包
uv pip install requests numpy

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

# 安装开发版本
uv pip install -e .

# 升级包
uv pip install --upgrade requests

# 卸载包
uv pip uninstall requests

# 列出已安装的包
uv pip list

# 显示包信息
uv pip show requests

需求文件管理

# 编译需求文件
uv pip compile requirements.in

# 编译为通用平台要求
uv pip compile requirements.in --universal

# 同步环境与需求文件
uv pip sync requirements.txt

# 生成当前环境的需求文件
uv pip freeze > requirements.txt

配置管理

配置文件

uv 支持多种配置文件格式:

pyproject.toml(推荐):

[tool.uv]
index-url = "https://pypi.org/simple"
extra-index-url = ["https://download.pytorch.org/whl/cpu"]
no-cache = false
cache-dir = "~/.uv/cache"

[tool.uv.pip]
index-url = "https://pypi.org/simple"
break-system-packages = false

uv.toml:

index-url = "https://pypi.org/simple"
extra-index-url = ["https://download.pytorch.org/whl/cpu"]

环境变量

# 设置默认索引 URL
export UV_INDEX_URL="https://pypi.org/simple"

# 禁用缓存
export UV_NO_CACHE=1

# 设置缓存目录
export UV_CACHE_DIR="~/.uv/cache"

# 设置 Python 路径
export UV_PYTHON="python3.11"

高级功能

工作区管理

# 创建工作区根目录
mkdir my-workspace
cd my-workspace

# 创建工作区配置
cat > pyproject.toml << 'EOF'
[tool.uv.workspace]
members = ["packages/*"]
EOF

# 创建子包
uv init packages/core
uv init packages/api
uv init packages/cli

# 在工作区中添加内部依赖
cd packages/api
uv add --dev ../core

依赖解析策略

# 使用最低版本解析
uv add --resolution lowest-direct requests

# 使用最高版本解析
uv add --resolution highest requests

# 预发布版本
uv add --prerelease allow django

平台特定安装

# 为特定平台安装
uv pip install --platform linux torch

# 为特定 Python 版本安装
uv pip install --python-version 3.11 numpy

与其他工具的迁移

从 pip + virtualenv

# 旧方式
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt

# uv 方式
uv venv
uv pip sync requirements.txt

从 Poetry

# 初始化项目(uv 会自动转换 pyproject.toml)
uv init --from poetry

# 或手动迁移依赖
uv add $(poetry show --only=main --no-dev | awk '{print $1}')
uv add --dev $(poetry show --only=dev | awk '{print $1}')

从 Pipenv

# 从 Pipfile 安装依赖
uv pip install -r <(pipenv requirements)
uv pip install -r <(pipenv requirements --dev) --dev

故障排除

常见问题

  1. 1. 构建失败

    # 启用详细输出
    uv pip install --verbose package-name
    
    # 使用预编译的轮子
    uv pip install --only-binary=all package-name
  2. 2. 网络问题

    # 使用不同的索引
    uv pip install --index-url https://pypi.org/simple package-name
    
    # 设置代理
    export HTTPS_PROXY=http://proxy.company.com:8080
  3. 3. 缓存问题

    # 清除缓存
    uv cache clean
    
    # 临时禁用缓存
    uv --no-cache pip install package-name

调试信息

# 显示详细信息
uv --verbose pip install package-name

# 显示版本信息
uv version

# 显示配置信息
uv pip show --verbose

性能优化

缓存管理

# 查看缓存统计
uv cache info

# 清理缓存
uv cache clean

# 清理特定包的缓存
uv cache clean package-name

并行安装

# uv 默认启用并行安装,可以调整并发数
export UV_CONCURRENT_DOWNLOADS=10
export UV_CONCURRENT_BUILDS=4

最佳实践

  1. 1. 项目结构:使用 uv init 创建标准项目结构
  2. 2. 依赖管理:定期运行 uv lock 更新锁定文件
  3. 3. 虚拟环境:每个项目使用独立的虚拟环境
  4. 4. 版本固定:在 CI/CD 中使用 uv.lock 确保可重现构建
  5. 5. 工具分离:使用 uv tool install 安装全局工具

总结

通过在 ComfyUI 调试房间启动优化项目中的实际应用,uv 证明了自己是一个功能强大、性能卓越的 Python 包管理工具。它不仅简化了 Python 开发工作流程,更重要的是带来了实实在在的效率提升。

项目收益总结:

  • • 开发效率: 调试房间启动时间从 15-20 分钟缩短到 2-3 分钟,提升了 80% 以上
  • • 开发体验: 开发者可以更频繁地进行环境重建,降低了环境问题的调试成本
  • • 资源优化: 全局缓存机制节省了大量磁盘空间和网络带宽
  • • 团队协作: 统一的锁定文件确保了团队成员之间环境的一致性

技术优势:
uv 通过其 Rust 实现带来的性能提升和现代化的设计理念,成功地解决了传统 Python 工具链的痛点。它提供了统一的接口来处理项目管理、依赖安装、虚拟环境和工具管理等任务,让开发者能够享受到更快的安装速度、更好的依赖解析、更简洁的工作流程。

与 mise 的协作:
对于需要多语言环境的团队,uv 和 mise 的结合使用提供了最佳的开发体验 - mise 负责语言版本管理,uv 负责 Python 生态的深度优化。

无论你是个人开发者还是团队负责人,uv 都值得在你的工具箱中占据一席之地。它不仅是 pip 的替代品,更是 Python 开发效率提升的加速器。

 

 

转自:https://mp.weixin.qq.com/s/VlopncKMAorMZGSk3mhF4g

 

点赞

发表回复