凡心所向,素履以往;生如逆旅,一苇以航

UV 包管理工具:替代 pip 的现代化解决方案

介绍

UV 是一个现代化的 Python 包管理工具,旨在替代传统的包管理工具,如 pipvirtualenv,提供更快速、高效、统一的开发体验。它的设计理念是提升包管理和虚拟环境管理的速度,并简化开发者的工作流。

UV 的主要特点:

  1. 高性能

    • 使用 Rust 编写,性能比传统的 Python 包管理工具(如 pip)快 10-100 倍。
    • 支持并行下载和安装包,具有智能缓存机制。
  2. 统一工具链

    • 一个命令行工具就可以完成多个任务,包括创建虚拟环境、安装包、运行脚本、添加依赖等。
    • 例如,通过 uv venv 创建虚拟环境,通过 uv pip install 安装包,通过 uv run 运行 Python 脚本。
  3. 现代化的依赖管理

    • 支持 pyproject.toml 文件pyproject.toml 文件是 Python 官方推荐的标准格式,用于描述项目的元数据和依赖关系。
    • 自动生成锁定文件,保证项目的依赖一致性。
    • 支持依赖组(如开发、文档、测试等依赖组),便于管理不同环境的依赖。
  4. PEP 723 支持

    • 支持在 Python 脚本中直接声明依赖,便于开发者更直观地管理依赖关系。
  5. 跨平台一致性

    • WindowsmacOSLinux 三大平台上有相同的使用方式,避免了跨平台的兼容性问题。

UV 的优势:

  • 速度快:通过并行化和智能缓存机制,提升了包的下载和安装速度。
  • 简单易用:一个命令行工具替代多个工具,减少了配置和使用的复杂性。
  • 统一管理:不仅管理 Python 环境,还能管理项目依赖,简化了开发流程。
  • PEP 723 支持:这种内联依赖声明方式使得 Python 脚本可以更加自包含,减少了外部依赖配置的复杂度。

使用场景:

  • 适合现代开发者:对于追求效率和现代化工作流的开发者来说,uv 是一个理想的工具。
  • CI/CD 环境:对于需要快速构建和部署的持续集成/持续部署环境,uv 提供了很好的性能支持。
  • 新项目开发:推荐用于新项目,可以享受更快的包管理和虚拟环境创建体验。

适用范围:

  • 推荐使用:新项目、现代 Python 开发工作流、个人项目、CI/CD 任务。
  • 谨慎使用:复杂的遗留项目、企业环境(特别是需要私有源配置的场景)、对包构建有特殊要求的项目。

总结:

UV 是一个非常有前景的工具,适合于追求高效、快速的开发者。尽管它相较于 pipvirtualenv 还比较年轻,但它通过出色的性能和简化的工作流,提供了一个强有力的替代方案。


安装

方法一:使用安装脚本

  • macOS 和 Linux:

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

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

方法二:使用包管理器

  • macOS (Homebrew):

    brew install uv
    
  • Windows (Scoop):

    scoop install uv
    

通过 pip 安装

pip install uv

入门

使用虚拟环境

  1. 创建虚拟环境

    • 创建一个新的虚拟环境:

      uv venv myproject
      
    • 创建指定 Python 版本的虚拟环境:

      uv venv --python 3.11 myproject
      
    • 激活虚拟环境:

      • Linux/macOS:

        source myproject/bin/activate
        
      • Windows:

        myproject\Scripts\activate
        
  2. 安装包

    • 安装单个包:

      uv pip install requests
      
    • 安装多个包:

      uv pip install requests numpy pandas
      
    • 安装指定版本的包:

      uv pip install "django>=4.0,<5.0"
      
    • requirements.txt 安装:

      uv pip install -r requirements.txt
      

使用 UV 方式

  1. 项目初始化

    • 初始化一个新项目:

      uv init my_uv_test
      cd my_uv_test
      
    • 查看项目结构:

      tree .
      
    .
    ├── main.py
    ├── pyproject.toml
    └── README.md
    
    1 directory, 3 files
    
  2. 使用 pyproject.toml 管理依赖

    [project]
    name = "my-uv-test"
    version = "0.1.0"
    description = "Add your description here"
    readme = "README.md"
    requires-python = ">=3.12"
    dependencies = []
    
  3. 依赖管理

    • 安装依赖(从 pyproject.toml):

      uv pip install -e .
      
    • 安装开发依赖:

      uv pip install -e ".[dev]"
      
    • 安装所有可选依赖:

      uv pip install -e ".[dev,docs,web]"
      
    • 生成锁定文件:

      uv pip freeze > requirements.lock
      
    • 同步依赖(确保环境与 requirements.txt 完全一致):

      uv pip sync requirements.txt
      
  4. 添加依赖

    • 添加生产依赖:

      uv add requests
      uv add "django>=4.0,<5.0"
      uv add requests beautifulsoup4 pandas
      
    • 添加开发依赖:

      uv add --dev pytest black flake8
      uv add --dev "pytest>=7.0"
      
    • 添加可选依赖组:

      uv add --group docs sphinx sphinx-rtd-theme
      uv add --group web fastapi uvicorn
      

    更新后的 pyproject.toml

    [project]
    name = "my-uv-test"
    version = "0.1.0"
    description = "Add your description here"
    readme = "README.md"
    requires-python = ">=3.12"
    dependencies = [
        "requests>=2.32.3",
    ]
    

运行

  1. 选择 Python 版本的优先级顺序

    • 明确指定版本(最高优先级):

      uv run --python 3.11 script.py
      uv run --python python3.12 script.py
      uv run --python /usr/bin/python3.10 script.py
      
    • 使用 pyproject.toml.python-version 文件:

      • pyproject.toml:

        [project]
        requires-python = ">=3.9"
        
      • .python-version 文件:

        3.11.5
        
    • 设置环境变量:

      export UV_PYTHON=3.11
      uv run script.py
      
    • 系统默认 Python:

      uv run script.py
      
  2. 在没有 pyproject.toml 的情况下,uv 通过以下方式处理依赖

    • 使用 --with 参数临时安装包:

      uv run --with requests --with pandas script.py
      
    • 通过脚本内联声明依赖(PEP 723):
      在 Python 脚本顶部添加特殊注释:

      # /// script
      # dependencies = [
      #   "requests",
      #   "pandas>=1.0",
      # ]
      # ///
      

      然后直接运行:

      uv run script.py
      
    • 使用 requirements.txt

      uv run script.py
      
    • 完全不管理依赖:
      uv 会创建一个临时的虚拟环境,只安装 Python 标准库。


UV 的优缺点

优点 ⭐

  1. 极快的速度

    • 使用 Rust 编写,比 pip 快 10-100 倍
    • 并行下载和安装包
    • 智能缓存机制
  2. 统一的工具链

    • uv 负责所有功能:创建虚拟环境、包管理、运行脚本、添加依赖
  3. 现代化的依赖管理

    • 支持 pyproject.toml
    • 自动生成锁定文件
    • 依赖组管理(如 dev, docs, test)
  4. 开箱即用

    • 无需预先创建虚拟环境
  5. PEP 723 支持

    • 支持在脚本内声明依赖
  6. 跨平台一致性

    • Windows、macOS、Linux 行为一致

缺点 ⚠️

  1. 生态系统兼容性

    • 某些包的构建可能有问题
    • C 扩展包支持不完善
    • 企业环境的私有源配置较复杂
  2. 学习成本

    • 新的命令和概念
    • 与传统 pip/virtualenv 工作流不同
  3. 相对年轻

    • 社区较小,文档和教程不如 pip 丰富
  4. 依赖 Rust 生态

    • 某些平台缺少预编译二进制
    • 从源码编译需要 Rust 工具链

适用场景

推荐使用

  • 新项目开发
  • 对速度有要求的 CI/CD
  • 现代 Python 开发工作流
  • 个人项目和学习

谨慎使用

  • 传统企业环境
  • 复杂的遗留项目
  • 需要特殊包构建的项目
  • 团队对新工具抗拒

总结

uv 是 Python 包管理的未来趋势,特别适合追求效率的现代开发者。虽然还有一些兼容性问题,但其速度和易用性优势明显,值得在新项目中尝试使用。

评论栏