はじめに
Python開発で必ず直面するのが環境管理の問題です。「プロジェクトごとに異なるPythonバージョンを使いたい」「依存関係を整理したい」「チームで同じ環境を共有したい」といった課題を解決するために、様々なツールが存在します。
本記事では、従来の定番であるpyenv+venvと、最近注目されているuvを初心者向けに比較し、実際のプロジェクト例を通じてどちらを選ぶべきか迷うので私見をまとめました。
クイック比較表
項目 | pyenv + venv | uv |
---|---|---|
インストールの簡単さ | 普通(2つのツール) | 簡単(1つのツール) |
実行速度 | 普通 | 非常に高速 |
Pythonバージョン管理 | ◎(pyenvが強力) | ○(基本的な機能) |
パッケージ管理 | 普通(pip) | 高速(Rustベース) |
学習コスト | 普通 | 低い |
成熟度 | 高い(実績豊富) | 中程度(比較的新しい) |
チーム開発 | ○ | ◎(ロックファイル) |
ディスク使用量 | 多い | 少ない |
推奨される場面 | 複雑な環境切り替え | シンプルで高速な開発 |
各ツールの概要
pyenv + venv とは
pyenv:複数のPythonバージョンをインストール・切り替えるツール
venv:Pythonの標準仮想環境作成ツール
# pyenv使用例
pyenv install 3.11.5 # Python 3.11.5をインストール
pyenv global 3.11.5 # グローバルバージョンを設定
python -m venv myproject-env # 仮想環境作成
source myproject-env/bin/activate # 有効化
メリット:
- 豊富な実績と安定性
- 細かいPythonバージョン管理が可能
- 幅広いPythonバージョンをサポート
デメリット:
- セットアップが複雑
- パッケージインストールが遅い
- 2つのツールを覚える必要がある
uv とは
AstralがRustで開発した超高速なPython環境管理ツール
# uv使用例
uv init myproject # プロジェクト初期化
cd myproject
uv add requests # パッケージ追加
uv run python main.py # アプリ実行
メリット:
- 非常に高速(pip の10-100倍)
- シンプルな使い方
- 1つのツールで全て完結
- ディスク使用量が少ない
デメリット:
- 比較的新しいツール
- 一部の高度な機能が不足
- 情報がまだ少ない
実践:プロジェクト別の使い分け
プロジェクト例1:Webアプリケーション開発
シナリオ: FlaskでWebアプリを開発。チームで開発環境を統一したい。
uvを使用した場合:
# プロジェクト初期化
uv init webapp-project
cd webapp-project
# 必要なパッケージを追加
uv add flask
uv add sqlalchemy
uv add pytest
# 開発用パッケージも追加
uv add --dev black
uv add --dev flake8
# アプリケーション実行
uv run python app.py
# 依存関係の確認
uv tree
生成されるファイル:
# pyproject.toml
[project]
name = "webapp-project"
version = "0.1.0"
dependencies = [
"flask>=2.3.0",
"sqlalchemy>=2.0.0",
"pytest>=7.0.0",
]
[project.optional-dependencies]
dev = [
"black>=23.0.0",
"flake8>=6.0.0",
]
pyenv+venvを使用した場合:
# Pythonバージョン設定
pyenv install 3.11.5
pyenv local 3.11.5
# 仮想環境作成
python -m venv webapp-env
source webapp-env/bin/activate # Windows: webapp-env\Scripts\activate
# パッケージインストール
pip install flask sqlalchemy pytest
pip install black flake8
# 依存関係をファイルに保存
pip freeze > requirements.txt
# アプリケーション実行
python app.py
この場合の判断:
→ uvが有利。チーム開発でのロックファイルとシンプルさが決め手。
プロジェクト例2:データサイエンスプロジェクト
シナリオ: 複数のPythonバージョンで機械学習モデルを検証したい。
pyenv+venvを使用した場合:
# 異なるPythonバージョンでテスト
pyenv install 3.9.18
pyenv install 3.10.12
pyenv install 3.11.5
# Python 3.9環境
pyenv local 3.9.18
python -m venv ml-py39
source ml-py39/bin/activate
pip install pandas numpy scikit-learn
# Python 3.10環境
pyenv local 3.10.12
python -m venv ml-py310
source ml-py310/bin/activate
pip install pandas numpy scikit-learn
# Python 3.11環境
pyenv local 3.11.5
python -m venv ml-py311
source ml-py311/bin/activate
pip install pandas numpy scikit-learn
uvを使用した場合:
# プロジェクト初期化(Python 3.11デフォルト)
uv init ml-project
cd ml-project
# パッケージ追加
uv add pandas numpy scikit-learn jupyter
# 異なるPythonバージョンで実行(限定的)
uv run --python 3.10 python train.py
この場合の判断:
→ pyenv+venvが有利。複数Pythonバージョンの柔軟な管理が必要。
プロジェクト例3:CLIツール開発
シナリオ: Pythonでコマンドラインツールを開発し、配布したい。
uvを使用した場合:
# プロジェクト初期化
uv init mytool
cd mytool
# 依存関係追加
uv add click
uv add rich
# プロジェクト設定
cat > pyproject.toml << EOF
[project]
name = "mytool"
version = "0.1.0"
dependencies = [
"click>=8.0.0",
"rich>=13.0.0",
]
[project.scripts]
mytool = "mytool.main:cli"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
EOF
# 開発モードでインストール
uv pip install -e .
# ツール実行
mytool --help
pyenv+venvを使用した場合:
# 環境設定
pyenv local 3.11.5
python -m venv mytool-env
source mytool-env/bin/activate
# パッケージインストール
pip install click rich
# setup.py作成が必要
pip install -e .
# ツール実行
mytool --help
この場合の判断:
→ uvが有利。モダンなプロジェクト構成と高速性が魅力。
実際の性能比較
インストール速度テスト
人気のデータサイエンスパッケージでの比較:
# テスト対象パッケージ
# pandas, numpy, scikit-learn, matplotlib, jupyter
結果:
操作 | pyenv+venv | uv |
---|---|---|
環境作成 | 15秒 | 3秒 |
パッケージインストール | 120秒 | 12秒 |
依存関係解決 | 30秒 | 2秒 |
合計 | 165秒 | 17秒 |
ディスク使用量比較
同一プロジェクトでの比較:
項目 | pyenv+venv | uv |
---|---|---|
Python本体 | 150MB | 0MB(システム利用) |
仮想環境 | 300MB | 50MB |
パッケージキャッシュ | 500MB | 200MB |
合計 | 950MB | 250MB |
場面別推奨ツール
uvがおすすめな場面
✅ こんな人・プロジェクトに最適:
- Python初心者
- シンプルな環境管理で十分
- 高速な開発サイクルを重視
- モダンなプロジェクト構成を使いたい
- チーム開発でロックファイルを活用したい
- CIで高速なビルドが必要
プロジェクト例:
# Webアプリ開発
uv init webapp && cd webapp
uv add fastapi uvicorn
uv run uvicorn main:app --reload
# APIクライアント開発
uv init api-client && cd api-client
uv add requests pydantic
uv add --dev pytest httpx
pyenv+venvがおすすめな場面
✅ こんな人・プロジェクトに最適:
- 複数のPythonバージョンを頻繁に切り替える
- レガシープロジェクトのメンテナンス
- 既存のワークフローを変更したくない
- 特定のPythonバージョンでの検証が必要
- 企業環境で安定性を重視
プロジェクト例:
# レガシーシステム対応
pyenv install 2.7.18 # Python 2.7が必要な場合
pyenv install 3.6.15 # 古いライブラリ対応
pyenv local 3.6.15
python -m venv legacy-env
# 複数バージョンテスト
for version in 3.9.18 3.10.12 3.11.5; do
pyenv local $version
python -m venv test-env-$version
source test-env-$version/bin/activate
pip install -r requirements.txt
python -m pytest
deactivate
done
実践的な移行ガイド
pyenv+venvからuvへの移行
既存プロジェクトの移行手順:
# 1. 既存の依存関係を確認
pip freeze > requirements.txt
# 2. uvでプロジェクト初期化
uv init --no-readme my-migrated-project
cd my-migrated-project
# 3. 依存関係を変換
# requirements.txtから手動でpyproject.tomlに移行
# または一括追加
uv add $(cat ../requirements.txt | grep -v "^#" | tr '\n' ' ')
# 4. 開発依存関係を分離
uv add --dev pytest black flake8
# 5. 動作確認
uv run python -m pytest
uvからpyenv+venvへの移行(必要な場合)
# 1. pyproject.tomlから依存関係を確認
cat pyproject.toml
# 2. requirements.txtを生成
uv pip compile pyproject.toml -o requirements.txt
# 3. pyenv環境作成
pyenv local 3.11.5
python -m venv migrated-env
source migrated-env/bin/activate
# 4. 依存関係インストール
pip install -r requirements.txt
チーム開発での運用
uvを使ったチーム開発
推奨ワークフロー:
# 1. プロジェクトクローン
git clone https://github.com/team/project.git
cd project
# 2. 依存関係インストール(uv.lockから自動解決)
uv sync
# 3. 開発
uv add new-package
uv run python main.py
# 4. コミット(uv.lockも含める)
git add pyproject.toml uv.lock
git commit -m "Add new-package dependency"
CI設定例(GitHub Actions):
name: Test
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v1
- name: Set up Python
run: uv python install
- name: Install dependencies
run: uv sync
- name: Run tests
run: uv run pytest
pyenv+venvを使ったチーム開発
推奨ワークフロー:
# 1. プロジェクトクローン
git clone https://github.com/team/project.git
cd project
# 2. Pythonバージョン確認・設定
cat .python-version
pyenv install $(cat .python-version)
pyenv local $(cat .python-version)
# 3. 仮想環境作成・有効化
python -m venv venv
source venv/bin/activate
# 4. 依存関係インストール
pip install -r requirements.txt
pip install -r requirements-dev.txt
トラブルシューティング
uvでよくある問題
1. Pythonバージョンが見つからない
# エラー例
# error: No Python 3.12 installation found
# 解決方法
uv python install 3.12
# または
uv run --python 3.11 python main.py
2. パッケージの競合
# uv.lockを削除して再解決
rm uv.lock
uv sync
# 特定パッケージの更新
uv add package@latest
3. 古いプロジェクトとの互換性
# requirements.txtからの移行
uv init --no-readme .
uv add -r requirements.txt
pyenv+venvでよくある問題
1. pyenvがPythonを認識しない
# パスの確認
echo $PATH
# シェル設定を再読み込み
source ~/.bashrc # または ~/.zshrc
# pyenv初期化確認
pyenv init
2. 仮想環境が見つからない
# 現在の仮想環境確認
which python
echo $VIRTUAL_ENV
# 仮想環境一覧
ls -la ~/.virtualenvs/ # virtualenvwrapper使用時
3. パッケージインストールエラー
# pipのアップグレード
pip install --upgrade pip
# 権限エラーの場合
pip install --user package-name
実際の開発現場での選択基準
スタートアップ・個人開発
推奨:uv
# 理由:
# - 高速な開発サイクル
# - シンプルな環境管理
# - 少ないディスク使用量
# - モダンなツールチェーン
# 典型的なワークフロー
uv init myapp
uv add fastapi
uv run uvicorn main:app --reload
大企業・レガシーシステム
推奨:pyenv+venv
# 理由:
# - 安定性と実績
# - 既存ワークフローとの互換性
# - 詳細なPythonバージョン管理
# - 社内標準への適合
# 典型的なワークフロー
pyenv local 3.8.18 # 社内標準バージョン
python -m venv project-env
source project-env/bin/activate
pip install -r approved-requirements.txt
オープンソースプロジェクト
推奨:目的により使い分け
ライブラリ開発:pyenv+venv
# 複数Pythonバージョンでのテストが必要
tox # 複数環境でのテスト自動化
アプリケーション開発:uv
# 高速なCI/CDが重要
uv sync && uv run pytest
まとめ
選択フローチャート
プロジェクト開始時の判断フロー:
1. 複数のPythonバージョンでのテストが必要?
YES → pyenv+venv
NO → 2へ
2. 既存のワークフローがある?
YES → 変更コストを考慮して判断
NO → 3へ
3. 高速性・シンプルさを重視?
YES → uv
NO → pyenv+venv
4. チーム開発でロックファイルが重要?
YES → uv
NO → どちらでも可