Python環境管理はuvが最高 - おすすめのPython環境管理
この記事で解決できること
- ツール統一:pip + pyenv + virtualenv → uv一本で管理
- pyproject.toml一元管理:設定ファイル1個に統合
- 爆速インストール:pyenvの10-100倍高速
- 依存関係の自動管理:手動pip freezeから卒業
あなたはこんなことで困っていませんか?
Python開発では、複数のツールを組み合わせる必要があり、学習コストが高くなりがちです。
悩み1: ツールが多すぎ問題
Pythonバージョン管理、仮想環境、パッケージ管理...それぞれ別のツールを覚える必要があります。
# Pythonバージョン管理 pyenv install 3.11.9 pyenv local 3.11.9 # 仮想環境作成 python -m venv .venv source .venv/bin/activate # パッケージ管理 pip install django pip freeze > requirements.txt # または poetry init poetry add django
「覚えること多すぎ...どれ使えばいいの?」
悩み2: requirements.txt手動管理が辛い
パッケージを追加するたびに、手動でrequirements.txtを更新する必要があります。
# パッケージ追加 pip install requests # requirements.txt更新(手動) pip freeze > requirements.txt # → 依存の依存まで全部出力される(50行超え) # 後日、requestsだけ削除したい # 「どれがrequestsの依存か分からない...」
「依存関係の管理、もっと楽にならないの?」
悩み3: pyenv遅すぎ問題
pyenvはソースからPythonをビルドするため、インストールに5-10分かかります。
# Pythonインストール pyenv install 3.12.0 # → ソースからビルド...5-10分待つ... # 依存関係エラーでビルド失敗もある # error: zlib not found # error: openssl not found
「コーヒー淹れる時間できちゃった...」
悩み4: 設定ファイル分散問題
pip、pyenv、各種ツールの設定ファイルがバラバラに存在します。
プロジェクトルート/ ├── requirements.txt # pip ├── requirements-dev.txt # 開発用 ├── .python-version # pyenv ├── pyproject.toml # Black/ruff └── setup.py # パッケージング
「どこに何書けばいいの...?」
これらの悩み、すべて「uv」1つで解決できます。
この記事は「Python開発環境の悩み」シリーズの一部です。
他の悩みと解決策は 親記事 をご覧ください。
まず知っておきたい:uvって何?
uvは、Pythonプロジェクト管理をオールインワンで提供する次世代ツールです。
uv
役割:Pythonプロジェクト管理のオールインワンツール
- Pythonバージョン管理(pyenv相当)
- パッケージ管理(pip, poetry相当)
- 仮想環境(virtualenv相当)
- プロジェクト管理(pyproject.toml)
pyproject.toml
役割:プロジェクト設定の「唯一の信頼できる情報源」
- 依存関係リスト
- 開発用依存関係(dependency-groups)
- ツール設定(ruff, pyright等)
- プロジェクトメタデータ
dependency-groups
役割:開発用パッケージの分離管理
- 本番環境には不要なツール(pytest, ruff等)
uv sync --no-devで本番環境から除外可能- requirements-dev.txt不要
uvが置き換えるツール一覧
| 従来のツール | 役割 | uvでの実現 |
|---|---|---|
| pip, pip-tools | 依存関係管理 | uv add / uv remove |
| pyenv | Pythonバージョン管理 | uv python install / uv python pin |
| virtualenv, venv | 仮想環境 | uv venv |
| poetry, pipenv | プロジェクト管理 | uv init / uv sync |
| pipx | ツールインストール | uv tool install |
| twine | パッケージ公開 | uv publish |
6つのツール → uv 1つ
従来 vs uv 徹底比較
| タスク | 従来(pip + pyenv) | uv |
|---|---|---|
| Pythonインストール | pyenv install 3.11(5-10分) | uv python install 3.11(10秒) |
| 仮想環境作成 | python -m venv .venv | uv venv |
| パッケージ追加 | pip install django + pip freeze | uv add django |
| 依存関係ファイル | requirements.txt(手動更新) | pyproject.toml(自動更新) |
| dev依存管理 | requirements-dev.txt(別ファイル) | dependency-groups(同一ファイル) |
| 環境再現 | pip install -r requirements.txt | uv sync |
| ツール数 | 3-5個 | 1個 |
モダンなワークフロー:uv add/removeが基本
新規プロジェクトでは、uv initから始めて、uv add/removeでパッケージ管理します。uv pipは移行時のみ使用します。
新規プロジェクト作成(推奨フロー)
Step 1: プロジェクト初期化
# プロジェクト作成 uv init myproject cd myproject # 以下が自動作成される # .venv/ 仮想環境 # .python-version Pythonバージョン # pyproject.toml プロジェクト設定 # uv.lock 依存関係ロックファイル
Step 2: Pythonバージョン指定
# Pythonバージョン指定(自動ダウンロード) uv python pin 3.11 # pyenvのような遅いビルドなし! # バイナリダウンロードで10秒以内
Step 3: パッケージ追加
# 本番依存パッケージ追加 uv add django wagtail # 開発用パッケージ追加 uv add --dev pytest ruff pyright
Step 4: pyproject.toml確認
[project] name = "myproject" version = "0.1.0" requires-python = ">=3.11" dependencies = [ "django>=5.2.8", "wagtail>=6.3.4", ] [dependency-groups] dev = [ "pytest>=8.3.4", "ruff>=0.11.9", "pyright>=1.1.402", ]
これだけ!requirements.txt不要!
実践例:Wagtailプロジェクトのpyproject.toml
実際のプロダクション環境で使われている設定を見てみましょう。この設定では、本番依存17パッケージ、開発依存19パッケージを1ファイルで管理しています。
pyproject.toml(抜粋)
[project] name = "wagtail-template" version = "0.1.0" requires-python = ">=3.11" dependencies = [ "boto3>=1.38.10", "django>=5.2,<5.3", # メジャーアップデート防止 "django-storages>=1.14.6", "psycopg2-binary>=2.9.10", "wagtail>=7.1", # セキュリティ修正は自動取得 "gunicorn>=23.0.0", "celery>=5.3.0", "redis>=5.0.0", "django-allauth>=65.9.0", "drf-spectacular>=0.27.2", # ... 他17パッケージ ] [dependency-groups] dev = [ "pre-commit>=4.2.0", "django-debug-toolbar>=5.2.0", "ruff>=0.11.9", # リント&フォーマット "pytest-django>=4.11.1", # テスト "pytest-cov>=6.1.1", # カバレッジ "pyright>=1.1.402", # 型チェック "django-stubs>=5.2.0", # Django型スタブ "boto3-stubs>=1.38.30", # boto3型スタブ # ... 他19パッケージ ] [tool.uv.workspace] members = [ "docs", "tools", ] # 以下、ruff, pyright等のツール設定も全て同一ファイル # (次の記事で詳しく解説)
ポイント1: バージョン範囲指定
"django>=5.2,<5.3" # メジャーアップデート防止 "wagtail>=7.1" # セキュリティ修正は自動取得
意図しない破壊的変更を防ぎつつ、セキュリティ修正は自動で取得できます。
ポイント2: dependency-groups
# 開発環境 uv sync # 本番環境(dev依存除外) uv sync --no-dev
requirements-dev.txt不要。1つのファイルで本番・開発を分離管理できます。
uv add/removeの威力:推移的依存も自動削除
従来(pip)の問題
# パッケージ追加 pip install requests # requirements.txt更新(手動) pip freeze > requirements.txt # → requestsだけでなく依存も全て出力 # urllib3==2.0.7 # certifi==2023.7.22 # charset-normalizer==3.3.2 # idna==3.6 # requests==2.31.0 # 後日、requestsを削除したい pip uninstall requests # → requestsのみ削除 # → urllib3等の依存は残る(ゴミが溜まる) # 「どれがrequestsの依存か分からない...」
uv add/removeの解決
# パッケージ追加 uv add requests # → pyproject.tomlに自動追加 # → uv.lockに正確なバージョン固定 # → .venvに即インストール # pyproject.tomlはシンプル # dependencies = [ # "requests>=2.31.0" # ] # 後日、requestsを削除 uv remove requests # → requestsとその依存(urllib3等)も全て削除 # → pyproject.toml, uv.lockも自動更新 # 「クリーンな環境を維持できる!」
重要:uvは推移的依存関係(dependency of dependency)を追跡し、不要になったら自動削除します。pipでは手動管理が必要でした。
データで見るuv:圧倒的な速度
公式ベンチマークとJetBrains調査に基づく実測データをご紹介します。
JupyterLabインストール速度
| ツール | 時間 | 倍率 |
|---|---|---|
| pip | 21.4秒 | - |
| uv | 2.6秒 | 8.2倍高速 |
出典: uv公式ベンチマーク
仮想環境作成速度
| ツール | 倍率 |
|---|---|
| python -m venv | - |
| virtualenv | 11倍高速 |
| uv venv | 80倍高速 |
JetBrains Python Survey 2024: uv採用率
2024年の調査では、リリース初年度(2024年2月リリース)でuvの採用率が11%に達しました。
"uv hitting 11% in its first year of release is a notable achievement. Rust has enabled us to build highly performant tooling for Python."
GitHub Star成長:2024年2月〜11月
uvは2024年2月のリリースからわずか9ヶ月で73,000 starsを獲得。Python tooling分野で最速級の成長を記録しています。
73,300+ stars (2024年11月時点) | GitHubで見る
グラフで見るパフォーマンス差
パッケージインストール速度比較
Source: uv公式ベンチマーク
GitHub Stars成長推移(2024年)
Source: GitHub - astral-sh/uv
Python開発者のuv採用状況(2024年)
Source: JetBrains Python Survey 2024
pyenvからuvへ:30倍速いPythonバージョン管理
pyenvの遅いソースビルドとはおさらば。uvはビルド済みバイナリで10秒以内にインストール完了します。
pyenvの問題:ソースビルドで5-10分
# Pythonインストール(ソースビルド) pyenv install 3.11.9 # Downloading Python-3.11.9.tar.xz... # Installing Python-3.11.9... # [ビルド中...] 5-10分待機 # ※ zlibやopenssl等の依存でビルド失敗もある # インストール済みバージョン確認 pyenv versions # * system # 3.11.9 # バージョン切り替え pyenv local 3.11.9
マシンスペックによっては10分以上かかることも
uvの解決:バイナリDLで10秒
# Pythonインストール(バイナリDL) uv python install 3.11.9 # Downloading Python 3.11.9 # [10秒以内で完了] # Installed Python 3.11.9 # インストール済みバージョン確認 uv python list --only-installed # cpython-3.11.9-linux-x86_64-gnu # プロジェクトでバージョン固定 uv python pin 3.11.9 # Pinned Python 3.11.9 to `.python-version`
ビルド不要、依存エラーなし
pyenvからuvへの移行手順
Step 1: 現在のPythonバージョン確認
pyenv version # 3.11.9 (set by /path/to/project/.python-version)
Step 2: uvで同じバージョンを指定
uv python pin 3.11.9 # → .python-versionに3.11.9を記録 # → uvが自動でPython 3.11.9をダウンロード
Step 3: 動作確認
uv venv source .venv/bin/activate # Linux/Mac python --version # Python 3.11.9
Step 4: pyenv削除(任意)
# 完全移行する場合のみ # ~/.bashrc or ~/.zshrcからpyenv関連削除 # ~/.pyenvディレクトリ削除
uv pipは「レガシー互換モード」:移行時のみ使用
uv pipは既存プロジェクトからの移行や、一時的な検証に使います。新規プロジェクトでは uv add/remove を使いましょう。
uv pipを使うべきケース
ケース1: 既存プロジェクトからの移行
# requirements.txtがある既存プロジェクト uv pip install -r requirements.txt # 動作確認後、pyproject.tomlへ移行 # (後述)
ケース2: 一時的な検証
# 「とりあえずパッケージ試したい」 uv pip install some-experimental-package # 検証後、不要ならアンインストール uv pip uninstall some-experimental-package
uv add/removeを使うべきケース(推奨)
新規プロジェクト(絶対こっち)
uv init myproject cd myproject uv add django # → pyproject.toml自動更新 # → uv.lock自動生成
既存プロジェクト(移行後はこっち)
# requirements.txt → pyproject.toml移行後 uv add requests uv remove old-package # → 依存関係も自動管理
requirements.txt → pyproject.toml 移行
方法1: uv initで既存プロジェクト初期化
# 既存プロジェクトディレクトリで uv init # → pyproject.tomlが作成される # requirements.txtの内容を移行 # 手動でpyproject.tomlに追記するか... # または、1つずつuv addで追加 uv add django djangorestframework # → pyproject.tomlに自動追加
方法2: 一括移行(推奨)
# requirements.txtの各行をuv addで追加 cat requirements.txt | grep -v "^#" | grep -v "^$" | while read pkg; do uv add "$pkg" done # または手動でpyproject.tomlに記述してから uv sync
Step 3: 動作確認
uv sync # → pyproject.tomlから環境再現 # テスト実行等で動作確認 uv run pytest
Step 4: requirements.txt削除
# 問題なければrequirements.txt削除 rm requirements.txt requirements-dev.txt # 以降はuv add/removeで管理
uv syncでチーム全員が同じ環境を再現
pyproject.toml + uv.lockがあれば、誰でも完全に同じ環境を構築できます。
チーム開発での使い方
開発者A: パッケージ追加
uv add pandas # → pyproject.toml更新 # → uv.lock更新(正確なバージョン固定) git add pyproject.toml uv.lock git commit -m "Add pandas for data analysis" git push
開発者B: 環境同期
git pull uv sync # → pyproject.toml + uv.lockから完全再現 # → 開発者Aと全く同じ環境が構築される
開発環境
# 開発用パッケージ含めて全てインストール uv sync # pytest, ruff, pyright等も含まれる
ローカル開発、CI/CDで使用
本番環境
# 開発用パッケージを除外してインストール uv sync --no-dev # django, wagtail等の本番依存のみ
本番デプロイ、Dockerイメージで使用
重要:uv.lockはgitにコミットしてください。これにより、チーム全員・CI/CD・本番環境で完全に同じバージョンのパッケージが使用されます。
よくある質問(FAQ)
A: 速度重視ならuv、高度な機能が必要ならpoetry継続も可。
- uvはpoetryの10-20倍高速(CI/CDで特に効果大)
- poetryの高度な機能(プライベートリポジトリ管理等)はuvでも実装済み
- 新規プロジェクトならuvを推奨
A: pyproject.toml移行後は不要です。
ただし、CI/CD等でrequirements.txtが必要な場合:
# pyproject.tomlからrequirements.txt生成 uv pip compile pyproject.toml -o requirements.txt
A: 使えます。公式でDockerイメージも提供されています。
FROM ghcr.io/astral-sh/uv:python3.11-bookworm-slim WORKDIR /app COPY pyproject.toml uv.lock ./ RUN uv sync --no-dev COPY . . CMD ["uv", "run", "gunicorn", "myapp.wsgi"]
A: 完全対応しています。
# インストール powershell -c "irm https://astral.sh/uv/install.ps1 | iex" # 使い方は同じ uv init myproject uv add django
WSL2でも、ネイティブWindowsでも動作します。
A: 段階的に導入できるので簡単です。
- まずは
uv pipでrequirements.txtを使い続ける - 動作確認後、
uv initでpyproject.tomlを作成 - パッケージ追加時から
uv addを使い始める - 最終的にrequirements.txt削除
A: 非常に低いです。pipを知っていれば5分で使えます。
主要コマンドは5つだけ:
uv init- プロジェクト作成uv add- パッケージ追加uv remove- パッケージ削除uv sync- 環境同期uv run- コマンド実行
まとめ:uvで変わるPython開発
uvを使うメリット
速度
- pip比で10-100倍高速
- pyenv比で30倍高速(Pythonインストール)
- CI/CDパイプライン大幅短縮
シンプルさ
- 6つのツールを1つに統一
- 設定ファイル1個(pyproject.toml)
- 学習コスト激減
依存関係管理
- 推移的依存の自動追跡・削除
- 手動pip freeze不要
- uv.lockで完全な環境再現
チーム開発
- uv syncで環境統一
- dependency-groupsで本番・開発分離
- 設定ファイル共有が簡単
サンプルコードリポジトリ
この記事で紹介したWagtailプロジェクトの設定は、実際のプロダクション環境で使用されています。
Django 5 + Wagtail 7 + uv の完全な設定例を公開しています。
関連記事
こちらの記事もおすすめです


まだコメントはありません。最初のコメントを残しませんか?