Python仮想環境 — venvと依存性管理
このトピックを終えると
仮想環境が必要な理由を理解し、venvを使用してプロジェクトごとに独立した環境を作成し、requirements.txtを使用して依存性を管理する方法を習得します。
なぜ仮想環境が必要なのか
Pythonでpip install requestsを実行すると、パッケージがシステム全体にインストールされます。2つのプロジェクトが同じパッケージの異なるバージョンを必要とする場合、問題が発生します。
プロジェクトA:requests==2.28.0が必要
プロジェクトB:requests==2.31.0が必要
システム:requestsは1つしかインストールできない → 衝突!仮想環境は、プロジェクトごとに独立したPython環境を作成します。各プロジェクトは独自のパッケージセットを持つため、衝突は発生しません。
プロジェクトA/venv:requests==2.28.0(独立)
プロジェクトB/venv:requests==2.31.0(独立)
システムPython:影響なしvenvの作成とアクティブ化
# 仮想環境の作成python3 -m venv venv
# アクティブ化(macOS/Linux)source venv/bin/activate
# アクティブ化(Windows)venv\Scripts\activate
# プロンプトが変更される(venv) $ python --versionPython 3.11.5python3 -m venv venvの2番目のvenvは、フォルダー名です。慣例として、venvまたは.venvを使用します。
アクティブ化の確認
# どのPythonを使用しているか?(venv) $ which python/home/user/project/venv/bin/python
# 非アクティブ化(venv) $ deactivate$ which python/usr/bin/python3アクティブにすると、pythonとpipは仮想環境内のものを指します。非アクティブにすると、システムPythonに戻ります。
仮想環境内のパッケージのインストール
(venv) $ pip install requests flask
(venv) $ pip listPackage Version---------- -------Flask 3.0.0requests 2.31.0...これらのパッケージは、venv/lib/フォルダーにインストールされます。システムPythonには影響しません。
requirements.txt — 依存関係の記録
# 現在インストールされているパッケージを記録(venv) $ pip freeze > requirements.txt# requirements.txt
Flask==3.0.0
Jinja2==3.1.2
MarkupSafe==2.1.3
Werkzeug==3.0.1
click==8.1.7
requests==2.31.0
urllib3==2.1.0
certifi==2023.11.17
charset-normalizer==3.3.2
idna==3.6pip freezeは、インストールされているすべてのパッケージと正確なバージョンを出力します。これをrequirements.txtに保存すると、他の人(またはサーバー)が同じ環境を再現できます。
依存関係のインストール
# 別の環境で同じパッケージをインストール(venv) $ pip install -r requirements.txt手動で作成 vs pip freeze
# 手動で作成(最小限)
Flask>=3.0
requests>=2.31
# pip freeze(すべて)
Flask==3.0.0
Jinja2==3.1.2
...(依存関係まですべて)pip freezeは、サブ依存関係も含めてすべてを記録します。手動で作成すると、主要なパッケージのみを指定し、バージョン範囲を使用できるため、柔軟性があります。プロジェクトの規模に応じて選択します。
.gitignore — venvをコミットしない
# .gitignore
venv/
.venv/
__pycache__/
*.pyc仮想環境フォルダーは、絶対にgitに含めないでください。理由:
- サイズ: venvフォルダーは数十〜数百MB
- OS依存: macOSで作成されたvenvは、Linuxで動作しない
- 再現可能:
requirements.txtがあれば、いつでも再作成可能
# 新しい環境でプロジェクトを開始git clone projectcd projectpython3 -m venv venvsource venv/bin/activatepip install -r requirements.txt実践的なワークフロー
# 1. プロジェクト開始mkdir my-project && cd my-projectpython3 -m venv venvsource venv/bin/activate
# 2. パッケージのインストールpip install flask requests pandas
# 3. 開発...
# 4. 依存関係の保存pip freeze > requirements.txt
# 5. git commitgit add .git commit -m "Add requirements"
# 6. 他の人が受け取って実行git clone <repo>cd my-projectpython3 -m venv venvsource venv/bin/activatepip install -r requirements.txtpython app.py複数のPythonバージョンの扱い
# システムにPython 3.10と3.12の両方がインストールされている場合python3.10 -m venv venv310python3.12 -m venv venv312
# 各venvは、作成時に使用したPythonバージョンにバインドされるsource venv310/bin/activatepython --version # Python 3.10.x
source venv312/bin/activatepython --version # Python 3.12.xvenvは、作成時点のPythonバージョンを使用します。プロジェクトごとに異なるPythonバージョンが必要な場合は、対応するバージョンでvenvを作成します。
venv vs conda
| venv | conda | |
|---|---|---|
| インストール | Pythonに組み込み | 別のインストール(Anaconda/Miniconda) |
| 範囲 | Pythonパッケージのみを管理 | Python + Cライブラリ + システムパッケージ |
| Pythonバージョン | システムにインストールされているバージョンのみを使用 | Python自体のバージョンも管理 |
| パッケージソース | PyPI(pip) | conda-forge + PyPI |
| 容量 | 軽い(数MB) | 重い(数GB) |
| 推奨対象 | Web開発、一般的なPython | データサイエンス、ML(NumPy/SciPyの依存関係が複雑) |
# conda環境の作成(比較のため)conda create -n myenv python=3.11conda activate myenvconda install numpy pandas scikit-learnデータサイエンスでcondaが好まれるのは、NumPyやSciPyなどのパッケージがC/Fortranライブラリに依存するためです。condaは、このようなバイナリ依存関係も管理します。ただし、Web開発や一般的なPythonプロジェクトでは、venvで十分です。
現代的な依存性管理 — pyproject.toml
Python 3.11以降のプロジェクトでは、requirements.txtの代わりにpyproject.tomlを使用する傾向があります。
# pyproject.toml
[project]
name = "my-project"
version = "1.0.0"
requires-python = ">=3.10"
dependencies = [
"flask>=3.0",
"requests>=2.31",
]
[project.optional-dependencies]
dev = [
"pytest>=7.0",
"black>=23.0",
]# pyproject.tomlに基づくインストールpip install . # プロダクション依存関係pip install ".[dev]" # 開発依存関係を含むrequirements.txtは単純なリストですが、pyproject.tomlはプロジェクトのメタデータ(名前、バージョン、Pythonバージョン制限)も含まれます。ライブラリを配布する予定がある場合は、pyproject.tomlが標準です。
よくある間違い
| 間違い | 結果 | 解決策 |
|---|---|---|
| venvがアクティブでない状態でpip install | システム全体にインストールされる | which pipで確認後、インストール |
| venvフォルダーをgitにコミット | リポジトリのサイズが急増 | .gitignoreにvenv/を追加 |
| requirements.txtを更新しない | 別の環境でパッケージが不足 | パッケージを追加/削除した後、pip freezeを再実行 |
| システムPythonに直接インストール | プロジェクト間の競合 | 常にvenv内で作業 |
pythonとpython3を混同 | 別のバージョンのPythonが実行される | venvをアクティブにした後、pythonで統一 |
重要なまとめ
| コマンド | 役割 |
|---|---|
python3 -m venv venv | 仮想環境を作成 |
source venv/bin/activate | アクティブ化 |
deactivate | 非アクティブ化 |
pip freeze > requirements.txt | 依存関係を記録 |
pip install -r requirements.txt | 依存関係をインストール |
仮想環境は、「プロジェクトごとに独立したPython」です。一度習慣にすると、パッケージの競合、「私のコンピューターでは動作するのに」という問題、およびデプロイ環境の不整合がなくなります。新しいプロジェクトを開始するときに、python3 -m venv venvを最初のコマンドとして実行することが、Python開発の基本です。