uvガイド:Pythonパッケージマネージャーについて

はじめに
Pythonの開発環境では、パッケージ管理ツールとして長らくpip
やpoetry
が使用されてきました。しかし、これらのツールには以下のような課題がありました:
- 依存関係の解決が遅い
- クロスプラットフォームでの一貫性が不十分
- 環境管理が複雑
これらの課題を解決するために開発されたのがuv
です。Rustで実装されたuv
は、高速で安全、そして使いやすいパッケージマネージャーとして注目を集めています。
uvの特長
1. 圧倒的な速度
- Rustによる実装で、依存関係の解決が従来のツールと比べて数倍高速
- 効率的なキャッシュ機構により、再インストールも高速
2. クロスプラットフォーム対応
- プラットフォーム間で一貫したロックファイル
- Windows、macOS、Linuxで同じ動作を保証
3. シンプルな使用方法
- 直感的なコマンド体系
- 最小限の設定で開始可能
インストール方法
💡 注意: インストール前の確認事項
- Python 3.8以上が必要です
- システム管理者権限が必要な場合があります
macOS/Linuxの場合
curl -LsSf https://astral.sh/uv/install.sh | sh
インストール後の確認:
uv --version
Windowsの場合
PowerShellで実行:
irm https://astral.sh/uv/install.ps1 | iex
インストール後の確認:
uv --version
その他のインストール方法
# pipを使用
pip install uv
# Homebrewを使用(macOS)
brew install uv
🔍 トラブルシューティング:
- インストール後に
uv
コマンドが見つからない場合は、PATHの設定を確認してください- Windowsの場合、PowerShellの実行ポリシーの変更が必要な場合があります
基本的な使い方
1. プロジェクトの初期化
📁 推奨プロジェクト構造:my-project/ ├── src/ │ └── my_project/ │ ├── __init__.py │ └── main.py ├── tests/ │ └── __init__.py ├── .gitignore ├── pyproject.toml └── README.md
# 新しいプロジェクトを作成
uv init my-project
# プロジェクトディレクトリに移動cd my-project
# 開発用の仮想環境を作成
uv venv
📝 pyproject.tomlの例:[project] name = "my-project" version = "0.1.0" description = "My Python Project" requires-python = ">=3.8" dependencies = [] [project.optional-dependencies] dev = ["pytest", "black", "ruff"] [build-system] requires = ["hatchling"] build-backend = "hatchling.build"
🚀 補足:
src/
レイアウトを使用することで、テスト時にインストール問題を早期に発見できます.gitignore
には.venv/
や__pycache__/
を追加することを推奨します- 必要に応じて
docs/
ディレクトリを追加してドキュメントを管理できます
2. パッケージの管理
# パッケージのインストール
uv pip install requests
# 開発用パッケージのインストール
uv pip install --dev pytest
# requirements.txtからのインストール
uv pip install -r requirements.txt
3. 依存関係の管理
🔧 一般的なユースケース別依存関係例:# Web開発用の依存関係 uv add fastapi uvicorn python-jose[cryptography] uv add --dev httpx pytest-asyncio # データサイエンス用の依存関係 uv add pandas numpy scikit-learn matplotlib uv add --dev jupyter nbconvert # CLI開発用の依存関係 uv add typer rich click uv add --dev pytest-cov black
# 基本的な依存関係の管理
uv add requests# 単一パッケージの追加
uv add 'requests>=2.30.0'# バージョン指定での追加
uv add requests[security]# エクストラ機能の追加# 開発用依存関係の追加
uv add --dev pytest# テスト用パッケージ
uv add --dev black ruff# コード品質管理ツール# 依存関係の削除
uv remove requests# パッケージの削除# 依存関係の更新
uv add --upgrade requests# 特定パッケージの更新
uv pip freeze > requirements.txt# 依存関係のエクスポート
💡 ベストプラクティス:
- 本番環境の依存関係と開発用依存関係は明確に分けましょう
- バージョン制約は必要な場合のみ指定しましょう
- 定期的に依存関係を更新して、セキュリティ修正を取り入れましょう
4. 環境の同期と依存関係のロック
# 依存関係のロック
uv pip compile requirements.in -o requirements.txt# requirements.inからロックファイルを生成
uv pip compile pyproject.toml -o requirements.txt# pyproject.tomlからロックファイルを生成
uv pip compile setup.py -o requirements.txt# setup.pyからロックファイルを生成
uv pip freeze | uv pip compile - -o requirements.txt# 現在の環境をロック# プロジェクトの依存関係を同期
uv sync# 全ての依存関係を同期
uv pip sync requirements.txt# 特定のrequirements.txtと同期# ロックファイルの更新
uv lock# ロックファイルを更新
💡 パッケージロックのポイント:
- 複数のソースファイル(requirements.in, pyproject.toml, setup.py)からロックファイルを生成可能
- 現在の環境から直接ロックファイルを生成することも可能
- ロックファイルを使用することで、環境間の一貫性を保証
高度な機能
1. Pythonバージョン管理
# 特定のバージョンのPythonをインストール
uv python install 3.12
# インストール済みのバージョンを確認
uv python list
2. ツールの実行
# 一時的な環境でツールを実行
uvx ruff check .
# ツールの永続的なインストール
uv tool install ruff
3. キャッシュ管理
# キャッシュのクリア
uv cache clean
# 未使用のキャッシュを削除
uv cache prune
4. 依存関係の解決戦略
# 最低バージョンでの依存関係解決
uv pip install --resolution=lowest requests
# 特定のPythonバージョンに対する解決
uv pip install --python-version=3.7 requests
# 依存関係のオーバーライド
uv pip install -o overrides.txt requests
🔍 解決戦略の特徴:
- デフォルトでは最新の互換バージョンを優先
-resolution=lowest
で最低互換バージョンをテスト可能-python-version
で対象Pythonバージョンを指定可能overrides.txt
で依存関係の宣言を上書き可能
他のツールとの比較
uv vs pip
機能 | uv | pip |
インストール速度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
依存関係の解決 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
クロスプラットフォーム | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
エコシステム | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
uv vs poetry
機能 | uv | poetry |
インストール速度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
設定の簡単さ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
プロジェクト管理 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
ロックファイル | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
uvへの移行ガイド
pipから移行する場合
- 現在の依存関係をエクスポート:
pip freeze > requirements.txt
- uvでプロジェクトを初期化:
uv init my-project
- 依存関係をインストール:
uv pip install -r requirements.txt
poetryから移行する場合
- poetryのpyproject.tomlをuvの形式に変換
- poetry.lockファイルをuv.lockに置き換え:
uv lock
- 環境を同期:
uv sync
実践的なユースケース
Dockerでの活用
# ベースイメージの選択FROM python:3.12-slim
# uvのインストールCOPY --from=ghcr.io/astral-sh/uv:latest /uv /bin/uv
COPY --from=ghcr.io/astral-sh/uv:latest /uvx /bin/uvx
# プロジェクトのセットアップWORKDIR /app
COPY . .
# 依存関係のインストールRUN uv pip install -r requirements.txt
GitHub Actionsでの活用
name: Python CI
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v3
- name: Install dependencies
run: uv pip install -r requirements.txt
- name: Run tests
run: uv run pytest
よくあるトラブルと解決方法
1. インストールの問題
問題:uv
コマンドが見つからない
# 解決方法# PATHの確認と追加echo 'export PATH="$HOME/.cargo/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
2. 依存関係の競合
問題:パッケージの競合によるuv sync
の失敗
# 解決方法# ロックファイルの再生成
uv lock --upgrade
uv sync
3. キャッシュの問題
問題:古いキャッシュによる動作不良
# 解決方法# キャッシュのクリア
uv cache clean
性能比較データ
キャッシュ使用時の速度比較
仮想環境の作成やパッケージの更新時(キャッシュ済み):
- 依存関係の解決: uvは従来のツールより80-115倍高速
- 環境作成:
python -m venv
より約80倍、virtualenv
より約7倍高速
初回実行時の速度比較
新規環境での実行(キャッシュなし):
- パッケージインストール: pipと比較して8-10倍高速
- 依存関係の解決: 大規模プロジェクトでも数秒で完了
💡 高速化の秘密:
- グローバルモジュールキャッシュの活用
- Copy-on-Writeとハードリンクによるディスクスペースの最適化
- Rustによる効率的な実装
現在の制限事項
- プラットフォーム固有のrequirements.txtの生成
- poetryやpdmのようなプラットフォーム非依存のロックファイルは未対応
- 一部のlegacy機能(.eggディストリビューションなど)は未サポート
pipが抱える課題
- 依存関係の解決が遅く、大規模プロジェクトで数時間かかることも
- 依存関係の設定ファイルが適切に管理されていないと「依存性の臭い」が発生
- 実行環境の復元時に推論の成功率が低くなる可能性
まとめ
uvは、Pythonのパッケージ管理に革新をもたらす新世代のツールです。高速な処理、クロスプラットフォーム対応、シンプルな使用方法という特長を持ち、多くの開発者に支持されています。
特に以下のような場合にuvの使用をお勧めします:
- 大規模なプロジェクトで依存関係の解決に時間がかかっている
- 複数のプラットフォームでの開発が必要
- シンプルで効率的なパッケージ管理を求めている
uvは日々進化を続けており、Pythonの開発環境をより快適にする強力なツールとなっています。