uv 和 uvx:现代化 Python 项目管理工具


uv 和 uvx:现代化 Python 项目管理工具

一、简介

[uv](https://docs.astral.sh/uv/) 是一个用 Rust 编写的极速 Python 包管理器和项目管理工具,由 Astral 开发。它旨在成为 pippip-toolspipxpoetrypyenv 等工具的现代化替代品,提供统一、快速、可靠的 Python 项目管理体验。

1.1 核心优势

  • 极速性能:比 pip 快 10-100 倍
  • 统一工具:集成多个工具的功能,一个工具解决所有问题
  • 现代化设计:原生支持 PEP 标准,无需 requirements.txt
  • 确定性构建:自动生成锁文件,确保环境可重现
  • 跨平台支持:Windows、macOS、Linux 全平台支持

二、安装 uv

2.1 官方推荐安装方式

# Windows (PowerShell)
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"

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

2.2 验证安装

uv --version

三、uv vs uvx:核心区别

工具 用途 适用场景
uv 项目管理和包管理 开发项目、管理依赖、运行项目代码
uvx 临时运行独立工具 运行开发工具、格式化代码、临时使用工具

四、uv:项目管理核心工具

4.1 项目初始化

# 创建新项目
uv init my-project
cd my-project

# 在现有目录初始化
uv init

# 指定 Python 版本
uv init --python 3.11

# 指定项目名称
uv init --name "my-awesome-project"

4.2 Python 版本管理

# 查看可用 Python 版本
uv python list

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

# 在项目中固定 Python 版本
uv python pin 3.11

# 查找系统中的 Python
uv python find

4.3 依赖管理

4.3.1 添加依赖

# 添加生产依赖
uv add requests
uv add "django>=4.0,<5.0"

4.3.2 移除依赖

# 移除包
uv remove requests

4.3.3 查看依赖

# 查看依赖树
uv tree

4.4 环境管理

# 同步环境(安装所有依赖)
uv sync

# 重新创建环境
rm -rf .venv
uv sync

4.5 运行代码

# 运行 Python 脚本
uv run script.py

五、uvx:临时工具运行器

5.1 基本用法

# 运行代码格式化工具
uvx black .
uvx isort .

# 运行代码检查工具
uvx flake8 .
uvx pylint src/

# 运行类型检查
uvx mypy src/

5.2 常用工具清单

# 代码格式化
uvx black .                    # Python 代码格式化
uvx isort .                    # 导入语句排序
uvx autopep8 --in-place *.py   # PEP8 格式化

# 代码检查
uvx flake8 .                   # 代码风格检查
uvx pylint src/                # 代码质量分析
uvx mypy src/                  # 静态类型检查
uvx bandit -r src/             # 安全漏洞检查

# 测试工具
uvx pytest                     # 运行测试
uvx coverage run -m pytest     # 测试覆盖率
uvx tox                        # 多环境测试

# 文档工具
uvx sphinx-quickstart          # 初始化 Sphinx 文档
uvx mkdocs new .               # 初始化 MkDocs 项目

# 项目工具
uvx cookiecutter gh:audreyr/cookiecutter-pypackage  # 项目模板
uvx pre-commit install         # Git 钩子工具

六、完整的项目开发流程

6.1 项目创建阶段

# 创建新项目
uv init --name "awesome-project" --python ">=3.9"
cd awesome-project

# 或使用项目模板
uvx cookiecutter gh:audreyr/cookiecutter-pypackage
cd your-project-name
uv init

6.2 依赖配置阶段

# 添加核心依赖
uv add requests fastapi

# 同步环境
uv sync

6.3 开发阶段

# 运行应用
uv run main.py

# 代码格式化
uvx black .
uvx isort .

# 代码检查
uvx flake8 .
uvx mypy src/

# 运行测试
uv run pytest
uv run pytest --cov=src tests/

6.4 代码质量保证

# 完整的代码检查流程
uvx black --check .           # 检查格式
uvx isort --check-only .      # 检查导入排序
uvx flake8 .                  # 风格检查
uvx mypy src/                 # 类型检查
uvx bandit -r src/            # 安全检查
uv run pytest --cov=src      # 测试和覆盖率

6.5 文档编写

# 初始化文档
uvx sphinx-quickstart docs/

# 或使用 MkDocs
uvx mkdocs new .
uvx mkdocs serve

# 生成 API 文档
uvx sphinx-apidoc -o docs/source src/

6.6 构建和发布

# 构建包
uvx build

# 检查包
uvx twine check dist/*

# 发布到 PyPI
uvx twine upload dist/*

# 发布到测试 PyPI
uvx twine upload --repository testpypi dist/*

七、pyproject.toml 配置示例

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "awesome-project"
version = "0.1.0"
description = "An awesome Python project"
readme = "README.md"
requires-python = ">=3.9"
license = {text = "MIT"}
authors = [
    {name = "Your Name", email = "your.email@example.com"}
]
classifiers = [
    "Development Status :: 3 - Alpha",
    "Intended Audience :: Developers",
    "License :: OSI Approved :: MIT License",
    "Programming Language :: Python :: 3",
    "Programming Language :: Python :: 3.9",
    "Programming Language :: Python :: 3.10",
    "Programming Language :: Python :: 3.11",
]

dependencies = [
    "requests>=2.28.0",
    "fastapi>=0.100.0",
    "pydantic>=2.0.0",
]

[project.optional-dependencies]
dev = [
    "pytest>=7.0.0",
    "pytest-cov>=4.1.0",
    "black>=23.0.0",
    "isort>=5.12.0",
    "flake8>=6.0.0",
    "mypy>=1.0.0",
]

db = [
    "sqlalchemy>=2.0.0",
    "psycopg2-binary>=2.9.0",
]

test = [
    "pytest-asyncio>=0.18.0",
    "factory-boy>=3.2.0",
    "httpx>=0.24.0",
]

[project.scripts]
awesome-cli = "awesome_project.cli:main"

[project.urls]
Homepage = "https://github.com/username/awesome-project"
Repository = "https://github.com/username/awesome-project"
Issues = "https://github.com/username/awesome-project/issues"

[tool.black]
line-length = 88
target-version = ["py39", "py310", "py311"]

[tool.isort]
profile = "black"
line_length = 88

[tool.pytest.ini_options]
testpaths = ["tests"]
python_files = "test_*.py"
python_classes = "Test*"
python_functions = "test_*"
addopts = "--cov=src --cov-report=term-missing"

[tool.mypy]
python_version = "3.9"
warn_return_any = true
warn_unused_configs = true
disallow_untyped_defs = true

八、常见问题和解决方案

8.1 依赖冲突

# 检查冲突
uv check

# 查看详细依赖树
uv tree --show-version-specifiers

# 强制解决冲突
uv lock --resolution-strategy highest

8.2 环境问题

# 重建环境
rm -rf .venv
uv sync

# 清理缓存
uv cache clean

# 检查 Python 安装
uv python list

8.3 性能优化

# 并行安装
uv sync --no-build-isolation

# 使用缓存
uv cache info

# 预编译包
uv add --precompiled numpy

九、最佳实践

9.1 项目结构

my-project/
├── src/
│   └── my_project/
│       ├── __init__.py
│       └── main.py
├── tests/
│   └── test_main.py
├── docs/
├── pyproject.toml
├── uv.lock
├── README.md
└── .gitignore

9.2 依赖管理

  • 使用语义化版本约束:requests>=2.28.0,<3.0.0
  • 将开发依赖分组管理
  • 定期更新锁文件:uv lock --upgrade
  • 使用可选依赖组分离功能模块

9.3 开发工作流

# 每日开发流程
uv sync                    # 同步环境
uvx black .               # 格式化代码
uvx isort .               # 排序导入
uv run pytest            # 运行测试
uvx flake8 .              # 代码检查

9.4 CI/CD 集成

# GitHub Actions 示例
- name: Install uv
  uses: astral-sh/setup-uv@v1

- name: Install dependencies
  run: uv sync

- name: Run tests
  run: uv run pytest

- name: Check code quality
  run: |
    uvx black --check .
    uvx flake8 .

十、与其他工具对比

功能 pip/venv Poetry uv
安装速度 中等 极快
依赖解析 基础 优秀
锁文件 手动 自动 自动
Python 版本管理 需要 pyenv 需要 pyenv 内置
工具运行 需要 pipx 不支持 内置 uvx
学习曲线 平缓 中等 平缓

十一、常见命令速查表

11.1 uv 核心命令

# 项目管理
uv init                    # 初始化项目
uv sync                    # 同步依赖
uv run <command>           # 运行命令

# 依赖管理
uv add <package>           # 添加依赖
uv remove <package>        # 移除依赖
uv tree                    # 查看依赖树
uv lock                    # 锁定依赖

# Python 版本管理
uv python list             # 列出 Python 版本
uv python install <ver>    # 安装 Python 版本
uv python pin <ver>        # 固定项目 Python 版本

# 环境管理
uv venv                    # 创建虚拟环境
uv cache clean             # 清理缓存

11.2 uvx 常用命令

# 代码质量工具
uvx black .                # 代码格式化
uvx isort .                # 导入排序
uvx flake8 .               # 代码检查
uvx mypy .                 # 类型检查

# 开发工具
uvx jupyter lab            # 启动 Jupyter Lab
uvx pytest                # 运行测试
uvx sphinx-build           # 构建文档

# 包管理
uvx build                  # 构建包
uvx twine upload           # 上传包

十二、总结

uv 和 uvx 提供了现代化的 Python 项目管理解决方案:

  • uv 适用于项目开发、依赖管理、环境管理
  • uvx 适用于运行开发工具、临时工具使用
  • 两者结合使用可以覆盖 Python 开发的全流程
  • 相比传统工具,提供了更快的速度和更好的用户体验

通过本指南,您可以完全使用 uv/uvx 替代传统的 pip、venv、poetry 等工具,享受现代化 Python 开发的便利。

十三、参考资料


最后更新:2025年7月14日


文章作者: BITBCI
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 BITBCI !
  目录