「uvを使って環境構築してください」AIエージェントにそう指示ても、uvの古いコマンドを使い何度もエラーを出力します。
私はPythonで開発を行うときには環境管理ツール「uv」を使っています。AIを活用した開発でもuvを使いたかったのですが毎回AIが間違えるのでpipとvenvを使う方法を指示しなおしていました。
この現象には技術的な背景がありそうです。uvは2024年2月に初期リリースされ、その後の数ヶ月で大幅な機能拡張が行われました。一方で多くのAIモデルの知識カットオフ日はこの重要な進化期間と重なっています。さらに、インターネット上に古い情報が更新されずに残存し、初期バージョンについての記事が多くAIの学習に過剰な影響を与えているのではと考えています。
これではuvの良さが活かせないと思い最新のuvについての情報をまとめました。
本記事はuvの最新機能と正確な使い方を確認するためのガイドです。また記事の最後には「AIエージェント用プロンプト」を用意しました。このプロンプトを使えば AIと共同開発する際にuvの能力を最大限に活用しましょう。
はじめに
Pythonの開発環境管理とパッケージ管理は、さまざまなツールによって行われてきました。pyenvでPythonバージョンを管理し、venvで仮想環境を作成し、pipでパッケージをインストールする、あるいはpoetryでプロジェクト管理するといった手法が一般的でした。
しかし、これらの既存ツールには依存関係解決の遅さ、プラットフォーム間の互換性問題、設定の複雑さなどの課題がありました。これらの問題を解決すべく登場したのが、Rustで実装された高速なパッケージマネージャー「uv」です。
本記事では、uvの特徴から基本的な使い方、高度な設定まで、包括的に解説します。そして最後に、AIエージェントと共に正確にuvを使うためのプロンプトを提供します。
1. uvとは
1.1 概要と特徴
uvは、Astral(以前はRuffチームとして知られていた)が開発した、Python向けの高速パッケージインストーラーおよび環境管理ツールです。その名前はUniVerse(宇宙)に由来しています。
uvの主な特徴は次のとおりです:
- 圧倒的な速度: Rustで実装されており、従来のPythonツールと比較して非常に高速です
- 一貫性: Pythonバージョン管理からパッケージ管理まで、単一のツールに統合
- 互換性: pip互換APIを提供し、既存のワークフローに簡単に統合可能
- クロスプラットフォーム: 同じロックファイルを異なるOS間で共有可能
- 強力なキャッシュ機構: パッケージのダウンロードとビルドをキャッシュして処理を高速化
1.2 従来ツールとの違い
機能 | pip | venv | poetry | pyenv | uv |
---|---|---|---|---|---|
パッケージインストール | ✅ | ❌ | ✅ | ❌ | ✅ |
仮想環境管理 | ❌ | ✅ | ✅ | ❌ | ✅ |
Pythonバージョン管理 | ❌ | ❌ | ❌ | ✅ | ✅ |
ロックファイル | ❌ | ❌ | ✅ | ❌ | ✅ |
依存関係解決 | 遅い | - | 普通 | - | 非常に速い |
実装言語 | Python | Python | Python | Shell | Rust |
1.3 uvが解決する問題点
- 速度: パッケージのインストールと依存関係解決が非常に高速(pandasのインストールが約3秒で完了)
- 統一性: 複数のツールを使い分ける必要がなく、単一のツールで環境管理が可能
- 互換性: 異なるOSやアーキテクチャ間でも同じロックファイルを使用可能
- 分かりやすさ: 直感的なコマンド体系とシンプルな設定ファイル
2. インストールとセットアップ
2.1 インストール方法
macOS
Homebrewを使用する場合:
brew install uv
Linux
curlを使用する場合:
curl -LsSf https://astral.sh/uv/install.sh | sh
Windows
PowerShellを使用する場合:
irm https://astral.sh/uv/install.ps1 | iex
wingetを使用する場合:
winget install astral.uv
pipを使用する場合(すべてのOS共通):
pip install uv
2.2 インストール確認
インストールが完了したら、バージョン確認コマンドでインストールが正常に行われたことを確認します:
uv --version
2.3 基本設定
uvは特別な設定を必要としませんが、以下のようにしてキャッシュディレクトリの場所などを環境変数で設定できます:
# キャッシュディレクトリの設定
export UV_CACHE_DIR=~/.cache/uv
# キャッシュを無効にする場合
export UV_NO_CACHE=1
3. Python管理機能
3.1 Pythonバージョンの確認とインストール
利用可能なPythonバージョンを確認:
uv python list --available
特定のバージョンをインストール:
uv python install 3.12
複数のバージョンを一度にインストール:
uv python install 3.10 3.11 3.12
インストール済みのバージョン一覧を表示:
uv python list
3.2 プロジェクトのPythonバージョン指定
プロジェクトディレクトリ内でPythonバージョンを固定:
uv python pin 3.12
これにより、.python-version
ファイルが作成され、プロジェクトで使用するPythonバージョンが指定されます。
3.3 pyenvからの移行
pyenvを使用している場合、以下のように移行できます:
-
pyenvで管理しているバージョンを確認
pyenv versions
-
必要なバージョンをuvでインストール
uv python install 3.10.4
-
プロジェクトの.python-versionファイルはそのまま活用可能
4. 仮想環境の管理
4.1 仮想環境の作成
uvで仮想環境を作成するには:
uv venv
特定のPythonバージョンを指定して作成:
uv venv -p 3.11
仮想環境のディレクトリを指定:
uv venv -p 3.12 ./my_venv
4.2 仮想環境の有効化
作成した仮想環境を有効化:
# Linux/macOS
source .venv/bin/activate
# Windows
.venv\Scripts\activate
4.3 既存プロジェクトへの適用
既存のプロジェクトに対して:
- プロジェクトディレクトリに移動
- 仮想環境を作成
- requirements.txtがある場合は依存関係をインストール
cd myproject
uv venv
source .venv/bin/activate
uv pip install -r requirements.txt
5. パッケージ管理
5.1 プロジェクトの作成
新しいプロジェクトを作成:
uv init myproject -p 3.12
cd myproject
これにより、基本的なプロジェクト構造とpyproject.toml
ファイルが作成されます。
5.2 依存関係の管理
パッケージの追加:
uv add numpy pandas matplotlib
開発用の依存関係の追加:
uv add --dev pytest black
依存関係の削除:
uv remove pandas
環境を最新化:
uv sync
依存関係の更新:
uv sync --upgrade
5.3 pyproject.tomlの構成
基本的なpyproject.toml
ファイルの例:
[project]
name = "myproject"
version = "0.1.0"
description = "My Python project"
readme = "README.md"
requires-python = ">=3.10"
dependencies = [
"numpy>=1.22.0",
"pandas>=2.0.0",
]
[project.optional-dependencies]
dev = [
"pytest>=7.0.0",
"black>=23.0.0",
]
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
5.4 特殊なソースからのインストール
PyTorchなど特殊なインデックスが必要なパッケージの場合:
[tool.uv.sources]
torch = [
{ index = "pytorch-cu121" },
]
[[tool.uv.index]]
name = "pytorch-cu121"
url = "https://download.pytorch.org/whl/cu121"
explicit = true
6. 高度な機能
6.1 キャッシュシステム
uvは強力なキャッシュ機構を備えており、以下の項目をキャッシュします:
- ダウンロードしたパッケージ
- ビルドされたwheelファイル
- 依存関係解決の結果
キャッシュの場所を確認:
uv cache dir
キャッシュのクリア:
uv cache clear
6.2 依存関係解決アルゴリズム
uvの依存関係解決は以下の要素を考慮します:
- バージョン制約
- プラットフォームマーカー
- 依存関係の競合
解決モードの指定:
# 最新バージョンを優先(デフォルト)
uv sync
# 最低バージョンを優先
uv sync --resolution lowest
# 直接依存のみ最低バージョンを優先
uv sync --resolution lowest-direct
6.3 依存関係ツリーの表示
依存関係ツリーを表示:
uv tree
特定のパッケージの依存関係を表示:
uv tree pandas
6.4 ロックファイルのエクスポート
異なる形式へのエクスポート:
# requirements.txt形式にエクスポート
uv export -f requirements
7. ツール実行
7.1 uvxコマンド
uvxコマンド(uv tool runの別名)を使うと、パッケージが提供するコマンドラインツールを一時的な環境で実行できます:
# pytestを実行
uvx pytest
# blackでフォーマット
uvx black .
プラグインと一緒に実行:
# pytest-covを含めて実行
uvx --with pytest-cov pytest --cov
7.2 恒久的なツールのインストール
頻繁に使用するツールを恒久的にインストール:
uv tool install black ruff
7.3 スクリプト実行
仮想環境内でスクリプトを実行:
uv run script.py
特定のPythonバージョンでスクリプトを実行:
uv run --python 3.10 script.py
8. 実践的なワークフロー
8.1 新規プロジェクト開発の例
# プロジェクト作成
uv init myapp -p 3.12
cd myapp
# 依存関係の追加
uv add fastapi uvicorn sqlalchemy
# 開発用依存関係の追加
uv add --dev pytest black ruff
# 仮想環境で実行
uv run app.py
8.2 CI/CDでの利用
GitHub Actionsの設定例:
name: Test
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Install uv
uses: astral-sh/setup-uv@v3
with:
enable-cache: true
- name: Install dependencies
run: uv sync
- name: Test
run: uv run pytest
8.3 Dockerとの統合
Dockerfileの例:
FROM python:3.12-slim
# uvをインストール
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
# プロジェクトをコピー
COPY . /app
WORKDIR /app
# 依存関係をインストール
RUN uv sync --frozen
# アプリケーションを実行
CMD ["uv", "run", "app.py"]
9. トラブルシューティング
9.1 一般的な問題と解決法
インストールの問題
問題:uvがパッケージをインストールできない場合
解決:
# キャッシュをクリア
uv cache clear
# pip互換モードを試す
uv pip install package_name
依存関係の解決の問題
問題:依存関係の解決ができない場合
解決:
# 詳細なエラーログを表示
uv sync -v
特定のソースからのインストール問題
問題:カスタムインデックスからのインストールが失敗する場合
解決:pyproject.toml
の[tool.uv.sources]
と[tool.uv.index]
セクションを確認
9.2 パフォーマンス最適化
- ローカルキャッシュをクリアせずに保持する
- 大規模プロジェクトでは
--frozen
フラグを使ってロックファイル通りにインストール - 開発環境では
--upgrade
を必要なときだけ使用
10. まとめと展望
10.1 uvの現状と将来性
uvは比較的新しいツールですが、その速度と統合された機能性により急速に採用が広がっています。Rustで実装された他のPythonツール(Ruff, Maturin, Pydantic-Coreなど)の成功を見ると、uvの将来性も期待できます。
特に、以下の点が評価されています:
- 開発環境のセットアップ時間の大幅な短縮
- 単一ツールでの統合管理の利便性
- クロスプラットフォーム互換性
- 大規模プロジェクトでのパフォーマンス
10.2 他のツールからの移行ガイド
pipからの移行
基本的にpip
コマンドをuv pip
に置き換えるだけで動作します。例:
# pipの場合
pip install -r requirements.txt
# uvの場合
uv pip install -r requirements.txt
poetryからの移行
- poetryで管理されているプロジェクトのpyproject.tomlは基本的にそのまま利用可能
- poetry.lockをuv.lockに変換する場合:
uv export -f lock
pyenvからの移行
- pyenvでインストールしていたPythonバージョンをuvでインストール
- プロジェクトの.python-versionファイルはそのまま利用可能
参考リソース
AIエージェントがuvコマンドを誤る理由
冒頭でも触れたように、AIエージェントがuvコマンドを誤って使用する根本的な理由には、技術的な背景があります。ここではその詳細をAIを使ってまとめました。
uvの進化とLLMの知識カットオフの不運な重なり
uvは2024年2月15日にAstral社から初めてリリースされました。当初はpipとpip-toolsの代替として設計されたドロップイン置き換えツールでしたが、リリース後すぐに活発な開発が行われました。
2024年7月頃には初期リリース以来最大の機能拡張が発表され、単なるpipの代替から、Pythonプロジェクト全体を管理するためのエンドツーエンドソリューションへと進化しました。この時点でもuvのAPIは「2024年時点では決して安定していない」と明記されていました。
一方で、主要なLLMの知識カットオフ日は以下のようになっています。
- GPT-4(2024年1月までの版): 2023年4月
- Claude 3モデル群: 2023年8月
- Claude 3.5 Sonnet: 2024年4月
- Claude 3.7 Sonnet: 2024年11月頃
これらの日付を比較すると、uvの初期リリースと主要な機能追加・API変更の期間は、多くの主要LLMの知識カットオフ日と重なるか、その直後に発生しています。
インターネット情報とLLMの学習の問題
LLMはインターネット上のコンテンツから学習しますが、以下のような問題があります:
-
情報の停滞と残存: 古いブログ記事やチュートリアルが更新されずに残り続け、uvの初期バージョンについての情報が過剰に残っています。
-
情報の比率と学習バイアス: 新しいツールの初期バージョンについての記事が爆発的に増える一方、最新情報は比較的少ないため、LLMの学習にバイアスがかかります。
-
非公式情報の影響: 公式ドキュメント以外の情報には不正確な内容も含まれ、LLMはそれらも区別なく学習します。
特に2024年後半のuv機能アップデートについては、情報量が少なく、最新のLLMであるClaude 3.7 Sonnetでも完全に把握できていない可能性があります。
おわりに
uvは、Pythonの環境管理とパッケージ管理を一新する可能性を秘めたツールです。そのシンプルさと高速性により、開発者の生産性を大きく向上させることができます。
この記事が、uvを使ったPython開発環境の構築と管理の参考になれば幸いです。特にAIエージェントと共に開発する場合は、次のセクションの「AIエージェント用プロンプト」をご活用ください。
最新のアップデートや詳細な機能については、常に公式ドキュメントを参照することをお勧めします。
AIエージェント用プロンプト
AIエージェント用 uvコマンドリファレンス
基本情報:
名称: uv (universe)
最新バージョン: 0.6.17 (2025年4月現在)
公式サイト: https://astral.sh/uv
リポジトリ: https://github.com/astral-sh/uv
概要: Rustで実装された高速なPythonパッケージマネージャーおよび環境管理ツール
インストール方法:
macOS (Homebrew): brew install uv
Linux/macOS (curl): curl -LsSf https://astral.sh/uv/install.sh | sh
Windows (PowerShell): irm https://astral.sh/uv/install.ps1 | iex
Windows (winget): winget install astral.uv
pip (全OS共通): pip install uv
Python管理コマンド:
利用可能なPythonバージョン一覧: uv python list --available
Pythonインストール: uv python install 3.12
複数バージョン同時インストール: uv python install 3.10 3.11 3.12
インストール済みバージョン一覧: uv python list
プロジェクト用Pythonバージョン固定: uv python pin 3.12
仮想環境管理コマンド:
仮想環境作成: uv venv
特定Pythonバージョンで仮想環境作成: uv venv -p 3.11
特定ディレクトリに仮想環境作成: uv venv -p 3.12 ./my_venv
仮想環境有効化 (Linux/macOS): source .venv/bin/activate
仮想環境有効化 (Windows): .venv\Scripts\activate
プロジェクト管理コマンド:
新規プロジェクト作成: uv init myproject -p 3.12
依存関係追加: uv add numpy pandas matplotlib
開発用依存関係追加: uv add --dev pytest black
依存関係削除: uv remove pandas
仮想環境同期: uv sync
依存関係アップグレード: uv sync --upgrade
依存関係ツリー表示: uv tree
パッケージ管理コマンド (pip互換):
パッケージインストール: uv pip install numpy pandas
特定バージョンインストール: uv pip install pandas==2.1.0
requirements.txtからインストール: uv pip install -r requirements.txt
パッケージアップグレード: uv pip install --upgrade numpy
ツール実行コマンド:
ツール一時実行: uv tool run pytest または uvx pytest
プラグイン付き実行: uvx --with pytest-cov pytest --cov
ツール永続インストール: uv tool install black ruff
Pythonスクリプト実行: uv run script.py
特定Pythonバージョンで実行: uv run --python 3.10 script.py
pyproject.toml 基本設定:
[project]
name = "myproject"
version = "0.1.0"
description = "Project description"
readme = "README.md"
requires-python = ">=3.10"
dependencies = [
"numpy>=1.22.0",
"pandas>=2.0.0",
]
[project.optional-dependencies]
dev = [
"pytest>=7.0.0",
"black>=23.0.0",
]
特殊インデックス設定例:
[tool.uv.sources]
torch = [
{ index = "pytorch-cu121" },
]
[[tool.uv.index]]
name = "pytorch-cu121"
url = "https://download.pytorch.org/whl/cu121"
explicit = true
依存関係解決オプション:
最新バージョン優先(デフォルト): uv sync
最低バージョン優先: uv sync --resolution lowest
直接依存のみ最低バージョン優先: uv sync --resolution lowest-direct
トラブルシューティング:
キャッシュディレクトリ表示: uv cache dir
キャッシュクリア: uv cache clear
詳細ログ表示: uv sync -v
主要エラー対応:
依存関係解決エラー: uv sync -v で詳細確認
パッケージ未発見エラー: インデックス設定確認
権限エラー: 管理者権限で実行
キャッシュ破損: uv cache clear で解決
注意点:
uvは常に最新バージョンのパッケージを優先するが、--resolution オプションで変更可能
プロジェクト間でuv.lockファイルは共有でき、異なるOSでも動作する
依存関係の解決は従来のツールと比較して著しく高速
基本コマンド構造: uv [サブコマンド] [オプション]