第120回 実務で使えるPython基礎:仮想環境とパッケージ管理(venv・pip・requirements・Poetry)で作る再現可能な実行環境

ローカルでは動くのに、チームメンバーやCIで動かない──こうした「環境の違い」による失敗は実務で頻繁に起きます。この記事では、現場で繰り返さないための実務的な手順と落とし穴を、コマンド例やCI/Dockerのサンプルとともに整理します。まずは「自分の環境が再現できない」ことに悩む読者に寄り添い、実際に手を動かせる形で説明します。

1. なぜ仮想環境と依存管理が必要か(現場の失敗事例)

現場でよくある失敗例を挙げます。どれも依存関係や環境の不一致が原因です。

  • パッケージのバージョン違いでテストが落ちる(ローカルは通っているがCIで失敗)
  • システムにインストールされたライブラリに依存してしまい、オンボーディングで同じ状態を作れない
  • バイナリ依存(numpy, torchなど)のインストールに失敗するが原因が明示されない

対処の基本方針は「環境の切り分け」「依存の明示(できれば固定)」「再現手順の自動化」です。

2. venv + pip + requirements のゼロから手順

まずは最もシンプルで依存が少ない方法です。手順とトラブル対処を示します。

作成・アクティベート

# 仮想環境作成
python -m venv .venv

# macOS/Linux
source .venv/bin/activate

# Windows (PowerShell)
.\.venv\Scripts\Activate.ps1

パッケージのインストールとfreeze

# パッケージをインストール
pip install requests numpy

# 環境を固定するrequirements.txtを作成
pip freeze > requirements.txt

インストール(別環境で再現)

python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

よくあるトラブルと対処

  • バイナリ依存でpip installが失敗する:wheelが利用できるか確認、必要ならプラットフォームに合うホイールを用意するかDockerで統一する
  • pipのバージョン差:依存の解決結果が変わることがあるため、pip自体もアップデートしておく(pip install -U pip)
  • requirements.txtが雑多になる:直接pip freezeを共有すると開発時の不要パッケージまで入ることがある。手動で主要依存をrequirements.inで管理し、pip-compileで固定する方法も検討する

3. Poetry入門+実務ワークフロー

Poetryは依存管理とパッケージングを一元化します。実務では、プロジェクトの移行・ロック・CIでの利用がやりやすくなります。

基本コマンド

# Poetry インストール(例)
# macOS/Linux
curl -sSL https://install.python-poetry.org | python3 -

# プロジェクト初期化
poetry init --name myproject --dependencies requests

# 依存追加
poetry add pandas

# lockfile生成(自動)
poetry lock

# 仮想環境内でコマンド実行
poetry run python -m pip install --upgrade pip

実務ワークフロー(移行例)

既存のrequirements.txtからPoetryへ移行する簡単な手順:

poetry init  # 最低限の情報を入力
# requirements.txtのパッケージを手動でpoetry addするか、次のように移行
while read pkg; do poetry add "${pkg%%=*}"; done < requirements.txt
poetry lock

移行後はpyproject.tomlとpoetry.lockをバージョン管理します。

4. Lockfileとピン固定戦略

再現性の鍵はlockfile(poetry.lock / requirements.txt pin)です。開発では柔軟性を残しつつ、本番やCIでは厳密に固定する運用が現実的です。

用途 開発環境 CI/本番
バージョン指定 主にメジャー/マイナーを許容(例: requests^2.31) lockfileで完全固定(poetry.lock または requirements.txt の厳密ピン)
更新頻度 週次〜月次で依存更新をテスト 承認ワークフロー経由で本番に反映

5. CI/CDとローカルで同一環境を保証する方法

代表的な手法は3つ:pipのrequirements、Poetryのexport、Dockerです。どれを選ぶかはチームのスキルやデプロイ方法によります。

GitHub Actionsでの例(venv + requirements)

name: CI (venv)

on: [push]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.11'
      - name: Install dependencies
        run: |
          python -m venv .venv
          source .venv/bin/activate
          pip install -U pip
          pip install -r requirements.txt
      - name: Run tests
        run: |
          source .venv/bin/activate
          pytest -q

GitHub Actionsでの例(Poetry)

name: CI (Poetry)

on: [push]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Setup Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.11'
      - name: Install Poetry
        run: curl -sSL https://install.python-poetry.org | python3 -
      - name: Install dependencies
        run: |
          poetry config virtualenvs.create true
          poetry install --no-interaction --no-ansi
      - name: Run tests
        run: poetry run pytest -q

Docker を使って環境を完全に統一する(ポイント)

Dockerfileのポイントはベースイメージの明示、Pythonバージョン固定、lockfileに基づくインストールです。

FROM python:3.11-slim
WORKDIR /app
COPY pyproject.toml poetry.lock ./
RUN pip install --no-cache-dir poetry && \
    poetry config virtualenvs.create false && \
    poetry install --no-root --no-dev
COPY . .
CMD ["python", "-m", "your_module"]

6. 依存性の脆弱性チェック・自動更新

脆弱性検査と依存更新の自動化は運用上重要です。代表的なツールを紹介します。

目的 ツール 備考
脆弱性検査 pip-audit requirements.txtや環境をスキャン。CIで定期実行を推奨
自動依存更新 Dependabot / Renovate pull requestで更新を自動作成。テストと承認フローの整備が必要

付録:実践的なコマンド例とテンプレート

以下はそのまま貼って使えるサンプルです。必要に応じてプロジェクト名やpython-versionを置き換えてください。

venv 基本

python -m venv .venv
source .venv/bin/activate
pip install -U pip setuptools wheel
pip install -r requirements.txt

requirements.txt を使ったexport(Poetry → requirements)

# Poetry から要件を export(CIやDockerで使う場合)
poetry export -f requirements.txt --output requirements.txt --without-hashes

GitHub Actions の最低限テンプレート(Poetry + pip-audit)

name: CI
on: [push]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Setup Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.11'
      - name: Install Poetry
        run: curl -sSL https://install.python-poetry.org | python3 -
      - name: Install dependencies
        run: |
          poetry install --no-interaction
      - name: Run tests
        run: poetry run pytest -q
      - name: Run pip-audit
        run: |
          poetry export -f requirements.txt --output reqs.txt --without-hashes
          pip install pip-audit
          pip-audit -r reqs.txt

運用上の注意点とチェックリスト

運用時に見落としがちな点をチェックリストにしました。各項目をチームで確認してください。

項目 確認ポイント
Pythonバージョン管理 pyproject.tomlやCIでpython-versionを明示し、.python-version(pyenv)やDockerfileで固定
バイナリ依存 numpy/torchなどはプラットフォームに依存。Dockerかホストで同一環境を用意する計画があるか
ネットワーク制限 企業ネットワークで外部PyPIがブロックされる場合、社内ミラーの利用やWheel配布を準備
オンボーディングスクリプト 初回セットアップスクリプト(venv作成、依存インストール、pytest実行)のテンプレートがあるか
依存更新ポリシー 更新頻度、テスト要件、承認フロー(例:週次で自動PR→ステージングで自動テスト→承認で本番反映)

読後の次の一歩(具体的なコマンド順)

以下の順で進めると、ローカル→CI→チーム導入までスムーズです。

  1. ローカルで環境作成
    python -m venv .venv
    source .venv/bin/activate
    pip install -U pip
    pip install -r requirements.txt  # または poetry install
    
  2. CIで同一手順を再現(上のGitHub Actionsテンプレートを使う)
  3. オンボーディングスクリプトを作成してREADMEに追加
    # setup.sh の例
    python -m venv .venv
    source .venv/bin/activate
    pip install -U pip
    pip install -r requirements.txt
    pytest -q
    

まとめ

実務で再現可能なPython環境を作るためには、単にツールを知るだけでなく「運用ルール」「lockfileの扱い」「CI/Dockerでの検証」が重要です。小さく始めるならvenv+pip+requirementsで十分です。チームやパッケージ管理を整理したいならPoetryが有効です。どちらの場合も、lockfileの運用、脆弱性チェック、自動更新のワークフローを設計しておけば、環境に起因するトラブルを大幅に減らせます。

次は:ローカルで環境を作ってCIでテストする、そしてオンボーディング手順を1つ作る。これだけで日常的なトラブルが減ります。必要であれば、あなたのプロジェクトに合わせたテンプレート作成も手伝います。