Python環境管理はuvが最高 - おすすめのPython環境管理
python 19 min read

Python環境管理はuvが最高 - おすすめのPython環境管理

avatar-m-1

karrinn

著者

この記事で解決できること

  • ツール統一:pip + pyenv + virtualenv → uv一本で管理
  • pyproject.toml一元管理:設定ファイル1個に統合
  • 爆速インストール:pyenvの10-100倍高速
  • 依存関係の自動管理:手動pip freezeから卒業

あなたはこんなことで困っていませんか?

Python開発では、複数のツールを組み合わせる必要があり、学習コストが高くなりがちです。

悩み1: ツールが多すぎ問題

Pythonバージョン管理、仮想環境、パッケージ管理...それぞれ別のツールを覚える必要があります。

BASH
# 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を更新する必要があります。

BASH
# パッケージ追加
pip install requests

# requirements.txt更新(手動)
pip freeze > requirements.txt
# → 依存の依存まで全部出力される(50行超え)

# 後日、requestsだけ削除したい
# 「どれがrequestsの依存か分からない...」

「依存関係の管理、もっと楽にならないの?」

悩み3: pyenv遅すぎ問題

pyenvはソースからPythonをビルドするため、インストールに5-10分かかります。

BASH
# Pythonインストール
pyenv install 3.12.0
# → ソースからビルド...5-10分待つ...

# 依存関係エラーでビルド失敗もある
# error: zlib not found
# error: openssl not found

「コーヒー淹れる時間できちゃった...」

悩み4: 設定ファイル分散問題

pip、pyenv、各種ツールの設定ファイルがバラバラに存在します。

TEXT
プロジェクトルート/
├── 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
pyenvPythonバージョン管理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 .venvuv venv
パッケージ追加pip install django + pip freezeuv add django
依存関係ファイルrequirements.txt(手動更新)pyproject.toml(自動更新)
dev依存管理requirements-dev.txt(別ファイル)dependency-groups(同一ファイル)
環境再現pip install -r requirements.txtuv sync
ツール数3-5個1個

モダンなワークフロー:uv add/removeが基本

新規プロジェクトでは、uv initから始めて、uv add/removeでパッケージ管理します。uv pipは移行時のみ使用します。

新規プロジェクト作成(推奨フロー)

Step 1: プロジェクト初期化

BASH
# プロジェクト作成
uv init myproject
cd myproject

# 以下が自動作成される
# .venv/              仮想環境
# .python-version     Pythonバージョン
# pyproject.toml      プロジェクト設定
# uv.lock            依存関係ロックファイル

Step 2: Pythonバージョン指定

BASH
# Pythonバージョン指定(自動ダウンロード)
uv python pin 3.11

# pyenvのような遅いビルドなし!
# バイナリダウンロードで10秒以内

Step 3: パッケージ追加

BASH
# 本番依存パッケージ追加
uv add django wagtail

# 開発用パッケージ追加
uv add --dev pytest ruff pyright

Step 4: pyproject.toml確認

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(抜粋)

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: バージョン範囲指定

TOML
"django>=5.2,<5.3"  # メジャーアップデート防止
"wagtail>=7.1"      # セキュリティ修正は自動取得

意図しない破壊的変更を防ぎつつ、セキュリティ修正は自動で取得できます。

ポイント2: dependency-groups

BASH
# 開発環境
uv sync

# 本番環境(dev依存除外)
uv sync --no-dev

requirements-dev.txt不要。1つのファイルで本番・開発を分離管理できます。

uv add/removeの威力:推移的依存も自動削除

従来(pip)の問題

BASH
# パッケージ追加
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の解決

BASH
# パッケージ追加
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インストール速度

ツール時間倍率
pip21.4秒-
uv2.6秒8.2倍高速

出典: uv公式ベンチマーク

仮想環境作成速度

ツール倍率
python -m venv-
virtualenv11倍高速
uv venv80倍高速

出典: Python UV Guide (DataCamp)

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."

— JetBrains Python Developers Survey 2024

出典: Python Developers Survey 2024 Results

GitHub Star成長:2024年2月〜11月

uvは2024年2月のリリースからわずか9ヶ月で73,000 starsを獲得。Python tooling分野で最速級の成長を記録しています。

73,300+ stars (2024年11月時点) | GitHubで見る

グラフで見るパフォーマンス差

パッケージインストール速度比較

仮想環境作成・Python管理の速度比較

GitHub Stars成長推移(2024年)

Python開発者のuv採用状況(2024年)

pyenvからuvへ:30倍速いPythonバージョン管理

pyenvの遅いソースビルドとはおさらば。uvはビルド済みバイナリで10秒以内にインストール完了します。

pyenvの問題:ソースビルドで5-10分

BASH
# 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秒

BASH
# 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バージョン確認

BASH
pyenv version
# 3.11.9 (set by /path/to/project/.python-version)

Step 2: uvで同じバージョンを指定

BASH
uv python pin 3.11.9
# → .python-versionに3.11.9を記録
# → uvが自動でPython 3.11.9をダウンロード

Step 3: 動作確認

BASH
uv venv
source .venv/bin/activate  # Linux/Mac
python --version
# Python 3.11.9

Step 4: pyenv削除(任意)

BASH
# 完全移行する場合のみ
# ~/.bashrc or ~/.zshrcからpyenv関連削除
# ~/.pyenvディレクトリ削除

uv pipは「レガシー互換モード」:移行時のみ使用

uv pipは既存プロジェクトからの移行や、一時的な検証に使います。新規プロジェクトでは uv add/remove を使いましょう。

uv pipを使うべきケース

ケース1: 既存プロジェクトからの移行

BASH
# requirements.txtがある既存プロジェクト
uv pip install -r requirements.txt

# 動作確認後、pyproject.tomlへ移行
# (後述)

ケース2: 一時的な検証

BASH
# 「とりあえずパッケージ試したい」
uv pip install some-experimental-package

# 検証後、不要ならアンインストール
uv pip uninstall some-experimental-package

uv add/removeを使うべきケース(推奨)

新規プロジェクト(絶対こっち)

BASH
uv init myproject
cd myproject
uv add django
# → pyproject.toml自動更新
# → uv.lock自動生成

既存プロジェクト(移行後はこっち)

BASH
# requirements.txt → pyproject.toml移行後
uv add requests
uv remove old-package
# → 依存関係も自動管理

requirements.txt → pyproject.toml 移行

方法1: uv initで既存プロジェクト初期化

BASH
# 既存プロジェクトディレクトリで
uv init
# → pyproject.tomlが作成される

# requirements.txtの内容を移行
# 手動でpyproject.tomlに追記するか...

# または、1つずつuv addで追加
uv add django djangorestframework
# → pyproject.tomlに自動追加

方法2: 一括移行(推奨)

BASH
# 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: 動作確認

BASH
uv sync
# → pyproject.tomlから環境再現

# テスト実行等で動作確認
uv run pytest

Step 4: requirements.txt削除

BASH
# 問題なければrequirements.txt削除
rm requirements.txt requirements-dev.txt

# 以降はuv add/removeで管理

uv syncでチーム全員が同じ環境を再現

pyproject.toml + uv.lockがあれば、誰でも完全に同じ環境を構築できます。

チーム開発での使い方

開発者A: パッケージ追加

BASH
uv add pandas
# → pyproject.toml更新
# → uv.lock更新(正確なバージョン固定)

git add pyproject.toml uv.lock
git commit -m "Add pandas for data analysis"
git push

開発者B: 環境同期

BASH
git pull

uv sync
# → pyproject.toml + uv.lockから完全再現
# → 開発者Aと全く同じ環境が構築される

開発環境

BASH
# 開発用パッケージ含めて全てインストール
uv sync

# pytest, ruff, pyright等も含まれる

ローカル開発、CI/CDで使用

本番環境

BASH
# 開発用パッケージを除外してインストール
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が必要な場合:

BASH
# pyproject.tomlからrequirements.txt生成
uv pip compile pyproject.toml -o requirements.txt

A: 使えます。公式でDockerイメージも提供されています。

DOCKERFILE
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
# インストール
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"

# 使い方は同じ
uv init myproject
uv add django

WSL2でも、ネイティブWindowsでも動作します。

A: 段階的に導入できるので簡単です。

  1. まずはuv pipでrequirements.txtを使い続ける
  2. 動作確認後、uv initでpyproject.tomlを作成
  3. パッケージ追加時からuv addを使い始める
  4. 最終的に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プロジェクトの設定は、実際のプロダクション環境で使用されています。

GitHubで見る

Django 5 + Wagtail 7 + uv の完全な設定例を公開しています。

関連記事

こちらの記事もおすすめです

ruff + pre-commit

コード整形、手動でやってない? - ruff + pre-commitで忘れない仕組みを作る

Pythonのコード整形と自動化について

記事を読む

Pyright

【Python × Pyright】型チェックって何? - Pyrightの現実的な設定で、厳しすぎない型チェックを実現する

Pyrightで型チェックを行う方法

記事を読む

全体像

Pythonプロジェクトの長期運用で本当に必要なこと - 環境・品質・型の3本柱

Pythonプロジェクトの長期運用で大切なこと

記事を読む

参考文献・リンク

関連トピック

コメント (0)

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

コメントを投稿

メールアドレスが公開されることはありません。必須項目には * が付いています