0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

uv vs pyenv+venv:Python環境管理ツール比較メモ

Posted at

はじめに

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  → どちらでも可

参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?