読み込み中...

requirements.txtを使いこなすための基本的な使い方と活用17選

requirements.txt 徹底解説 Python
この記事は約28分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

●requirements.txtとは?Pythonプロジェクトの救世主

Pythonプロジェクトを進める上で、依存関係の管理は避けて通れない重要な課題です。

複数の開発者が協力してコードを書く場合、それぞれの環境で同じバージョンのライブラリを使用しなければ、予期せぬエラーが発生する可能性があります。

そんな悩みを解決するのがrequirements.txtファイルです。

requirements.txtは、Pythonプロジェクトで使用されているパッケージとそのバージョンを記載したシンプルなテキストファイルです。

このファイルを活用することで、プロジェクトの依存関係を一元管理し、環境の再現性を高めることができます。

開発者間での環境の統一や、本番環境へのデプロイ時の設定ミスを防ぐなど、多くの場面で役立ちます。

○依存関係管理の重要性

ソフトウェア開発において、依存関係の管理は非常に重要です。

特にPythonのような多様なライブラリエコシステムを持つ言語では、適切な管理が欠かせません。

依存関係を適切に管理することで、次のようなメリットがあります。

  • 開発環境の統一/チーム全員が同じバージョンのライブラリを使用することで、「私の環境では動くのに」といった問題を回避できます。
  • 再現性の確保/プロジェクトを別のマシンや環境で動かす際に、必要なパッケージを簡単にインストールできます。
  • バージョン管理/使用するライブラリのバージョンを明確に指定することで、予期せぬ動作の変更を防ぐことができます。

○requirements.txtの役割と利点

requirements.txtファイルは、課題を解決するための強力なツールです。

主な役割と利点は次の通りです。

  • 依存関係の明確化/プロジェクトで使用しているパッケージとそのバージョンを一目で確認できます。
  • 環境の再現/新しい開発者がプロジェクトに参加する際や、新しいマシンでプロジェクトを始める際に、必要なパッケージを簡単にインストールできます。
  • バージョン固定/特定のバージョンを指定することで、予期せぬアップデートによる問題を防ぎます。
  • デプロイの簡素化/本番環境へのデプロイ時に、必要なパッケージを簡単にインストールできます。

●requirements.txtの基本的な使い方

requirements.txtファイルの基本的な使い方を理解することは、Pythonプロジェクト管理の第一歩です。

ここでは、ファイルの作成方法、パッケージのインストール方法、そしてバージョン指定の方法について、具体的なサンプルコードとともに解説します。

○サンプルコード1:requirements.txtの作成方法

requirements.txtファイルの作成は非常に簡単です。

テキストエディタを開いて、必要なパッケージ名を1行ずつ記述するだけです。

例えば、次のようなファイルを作成します。

numpy
pandas
matplotlib
scikit-learn

このファイルを保存し、requirements.txtという名前で保存します。

もし現在の環境にインストールされているパッケージをそのままrequirements.txtに書き出したい場合は、次のコマンドを使用します。

pip freeze > requirements.txt

このコマンドを実行すると、現在の環境にインストールされているすべてのパッケージとそのバージョンがrequirements.txtファイルに出力されます。

○サンプルコード2:requirements.txtからパッケージをインストールする

requirements.txtファイルからパッケージをインストールするには、次のコマンドを使用します。

pip install -r requirements.txt

このコマンドを実行すると、requirements.txtファイルに記載されているすべてのパッケージが自動的にインストールされます。

例えば、先ほど作成したrequirements.txtファイルを使用してパッケージをインストールする場合、次のような出力が表示されます。

Collecting numpy
  Downloading numpy-1.21.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (15.8 MB)
Collecting pandas
  Downloading pandas-1.3.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.5 MB)
Collecting matplotlib
  Downloading matplotlib-3.4.3-cp39-cp39-manylinux1_x86_64.whl (10.3 MB)
Collecting scikit-learn
  Downloading scikit_learn-0.24.2-cp39-cp39-manylinux2010_x86_64.whl (24.9 MB)
Installing collected packages: numpy, pandas, matplotlib, scikit-learn
Successfully installed matplotlib-3.4.3 numpy-1.21.2 pandas-1.3.3 scikit-learn-0.24.2

○サンプルコード3:バージョン指定の方法

特定のバージョンのパッケージをインストールしたい場合、requirements.txtファイル内でバージョンを指定できます。

特定のバージョンを指定する場合は、パッケージ名の後に==を付けてバージョン番号を記述します。

numpy==1.21.2
pandas==1.3.3

特定のバージョン以上を指定する場合は、>=を使用します。

matplotlib>=3.4.0
scikit-learn>=0.24.0

特定の範囲内のバージョンを指定する場合は、>=と<を組み合わせて使用します。

requests>=2.25.0,<2.26.0

このように記述することで、プロジェクトに必要な特定のバージョンのパッケージをインストールすることができます。

バージョン指定を適切に行うことで、互換性の問題を回避し、プロジェクトの安定性を高めることができます。

●requirements.txtの活用テクニック10選

requirements.txtファイルの基本的な使い方を理解したら、次はより高度な活用方法を学びましょう。

ここでは、プロジェクト管理を効率化し、チーム開発をスムーズに進めるための10の活用テクニックを紹介します。

今回のテクニックを身につければ、Pythonプロジェクトの依存関係管理がさらに洗練されたものになるでしょう。

○サンプルコード4:開発環境と本番環境の分離

開発環境と本番環境で異なるパッケージやバージョンを使用したい場合があります。

そんな時は、環境ごとにrequirements.txtファイルを分けるのが効果的です。

例えば、次のように分けることができます。

requirements.txt(共通の依存関係)

numpy==1.21.2
pandas==1.3.3

requirements-dev.txt(開発環境用の追加依存関係)

-r requirements.txt
pytest==6.2.5
flake8==3.9.2

requirements-prod.txt(本番環境用の追加依存関係)

-r requirements.txt
gunicorn==20.1.0

この方法を使えば、開発環境と本番環境の依存関係を明確に分離できます。

開発者は簡単にテスト用のパッケージをインストールでき、本番環境では必要最小限のパッケージのみをインストールすることが可能となります。

○サンプルコード5:GitHubからの直接インストール

公開されていないパッケージや、最新のコミットを使用したい場合、GitHubリポジトリから直接インストールすることができます。

requirements.txtファイルに次のように記述します。

git+https://github.com/user/repo.git@master#egg=package_name

このようにすると、指定したGitHubリポジトリの最新のコードを使用できます。

例えば、特定のブランチやタグを指定することも可能です。

git+https://github.com/user/repo.git@v1.0#egg=package_name

GitHubからの直接インストールは、カスタムパッケージや最新の開発版を使用する際に非常に便利です。

ただし、安定性を重視する場合は、公式にリリースされたバージョンを使用することをお勧めします。

○サンプルコード6:条件付きインストール

異なるPythonバージョンや環境に応じて、特定のパッケージをインストールしたい場合があります。

そんな時は、環境マーカーを使用した条件付きインストールが便利です。

ここでは、Python 3.7以上の場合にのみdataclassesをインストールする例を紹介します。

dataclasses; python_version < "3.7"

また、特定のOSに応じてパッケージをインストールすることも可能です。

pywin32; sys_platform == "win32"

条件付きインストールを活用すれば、異なる環境に対応したrequirements.txtファイルを1つにまとめることができ、環境ごとのファイル管理が簡素化されます。

○サンプルコード7:ローカルパッケージの指定

時には、ローカルに存在するパッケージをインストールしたい場合があります。

特に、社内で開発されたプライベートパッケージなどがこれに該当します。

ローカルパッケージをインストールするには、以下のように相対パスを指定します。

-e ./my_local_package

このようにすると、指定されたディレクトリにあるsetup.pyファイルを使用してパッケージがインストールされます。

開発中のパッケージをテストする際や、公開されていないパッケージを使用する際に非常に便利です。

○サンプルコード8:requirements.txtの自動生成

プロジェクトの依存関係が増えてくると、手動でrequirements.txtを管理するのが大変になってきます。

そんな時は、pipの機能を使って自動的にrequirements.txtを生成できます。

次のコマンドを実行してみましょう。

pip freeze > requirements.txt

このコマンドは、現在の環境にインストールされているすべてのパッケージとそのバージョンをrequirements.txtファイルに書き出します。

ただし、不要なパッケージも含まれる可能性があるため、生成後に内容を確認し、必要に応じて編集することをお勧めします。

自動生成したファイルの例

numpy==1.21.2
pandas==1.3.3
matplotlib==3.4.3
scikit-learn==0.24.2

requirements.txtの自動生成は、プロジェクトの依存関係を素早く把握し、環境の再現性を高めるのに役立ちます。

定期的に実行することで、常に最新の依存関係を維持できます。

○サンプルコード9:バージョン固定による再現性の確保

プロジェクトの再現性を高めるために、パッケージのバージョンを固定することが重要です。

バージョン固定により、異なる環境や時期でも同じ結果を得られる可能性が高まります。

具体的な方法を見てみましょう。

numpy==1.21.2
pandas==1.3.3
matplotlib==3.4.3
scikit-learn==0.24.2

上記のように、各パッケージに対して正確なバージョンを指定します。

この方法で、プロジェクトの動作環境を完全に再現できます。

ただし、セキュリティアップデートなどを逃す可能性があるため、定期的な更新が必要です。

バージョン固定は特に本番環境で重要です。

開発中に突然の変更が入ることを防ぎ、安定した環境を維持できます。

○サンプルコード10:セキュリティ更新の管理

セキュリティは常に重要な課題です。パッケージの脆弱性が発見された場合、迅速に対応する必要があります。

そのためには、セキュリティ更新を効率的に管理する仕組みが必要です。

numpy>=1.21.2,<1.22
pandas>=1.3.3,<1.4
matplotlib>=3.4.3,<3.5
scikit-learn>=0.24.2,<0.25

このように記述することで、マイナーバージョンのアップデートは許可しつつ、メジャーバージョンの変更は防ぐことができます。

セキュリティパッチが適用されても、互換性を維持しやすくなります。

定期的にrequirements.txtを更新し、最新のセキュリティパッチを適用することをお勧めします。

自動化ツールを使用して、脆弱性のあるパッケージを検出し、更新することも効果的です。

○サンプルコード11:requirements.txtの結合

大規模なプロジェクトでは、複数のrequirements.txtファイルを使用することがあります。

異なる環境や機能ごとに依存関係を分けて管理する場合、それらを結合する必要が出てきます。

例えば、次のような構成を考えてみましょう。

base.txt

numpy==1.21.2
pandas==1.3.3

web.txt

-r base.txt
flask==2.0.1
gunicorn==20.1.0

ml.txt

-r base.txt
scikit-learn==0.24.2
tensorflow==2.6.0

このように、共通の依存関係をbase.txtに記述し、それぞれの機能ごとにファイルを分けることで、管理がしやすくなります。

必要に応じて結合して使用できます。

結合したrequirements.txtを生成するには、次のコマンドを使用します。

pip install -r web.txt -r ml.txt > requirements.txt

このコマンドを実行すると、web.txtとml.txtの依存関係を結合した新しいrequirements.txtが生成されます。

○サンプルコード12:仮想環境との連携

Pythonの仮想環境は、プロジェクトごとに独立した環境を作成するのに役立ちます。

requirements.txtと仮想環境を組み合わせることで、より効率的な依存関係管理が可能になります。

仮想環境の作成とアクティベート

python -m venv myenv
source myenv/bin/activate  # Linuxの場合
myenv\Scripts\activate.bat  # Windowsの場合

仮想環境内でのrequirements.txtの使用

pip install -r requirements.txt

仮想環境の依存関係をrequirements.txtに出力

pip freeze > requirements.txt

仮想環境を使用することで、システムワイドのPython環境を汚染することなく、プロジェクト固有の依存関係を管理できます。

また、異なるプロジェクト間での依存関係の衝突も防ぐことができます。

○サンプルコード13:CI/CDパイプラインでの活用

継続的インテグレーション/継続的デリバリー(CI/CD)パイプラインでrequirements.txtを活用することで、ビルドプロセスを自動化し、一貫性を保つことができます。

GitHub Actionsを使用した例

name: Python application

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: 3.8
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt
    - name: Run tests
      run: |
        python -m unittest discover tests

このワークフローは、pushイベントが発生するたびに実行されます。

requirements.txtファイルから依存関係をインストールし、テストを実行します。

CI/CDパイプラインにrequirements.txtを組み込むことで、環境の一貫性を保ち、デプロイメントの信頼性を向上させることができます。

●requirements.txtのベストプラクティス

requirements.txtファイルを効果的に活用するには、いくつかのベストプラクティスを押さえておくことが大切です。適切な命名規則やファイル構成、コメントの活用、そして定期的な更新とメンテナンスを行うことで、プロジェクトの管理がより円滑になります。

○命名規則とファイル構成

効率的な依存関係管理のためには、適切な命名規則とファイル構成が欠かせません。プロジェクトの規模や特性に応じて、柔軟に対応することが重要です。

一般的な命名規則では、「requirements.txt」というファイル名が広く使われています。しかし、複数の環境や目的に応じて分割する場合は、より具体的な名前を付けることをお勧めします。例えば、「requirements-dev.txt」や「requirements-prod.txt」などです。

ファイル構成に関しては、プロジェクトのルートディレクトリにrequirements.txtを配置するのが一般的です。大規模なプロジェクトでは、専用のディレクトリを作成し、その中に複数のrequirements.txtファイルを格納することもあります。

例えば、以下のような構成が考えられます。

project_root/
    ├── requirements/
    │   ├── base.txt
    │   ├── development.txt
    │   └── production.txt
    ├── src/
    ├── tests/
    └── README.md

この構成により、環境ごとの依存関係を明確に分離でき、管理が容易になります。

○コメントの活用方法

requirements.txtファイル内にコメントを追加することで、依存関係の目的や注意点を明確にできます。コメントは「#」で始まる行として記述します。

例えば、以下のようなコメントを追加することができます。

# Web application framework
Flask==2.0.1

# データ処理用ライブラリ
numpy==1.21.2
pandas==1.3.3

# 機械学習ライブラリ
scikit-learn==0.24.2

# 注意: tensorflow-gpuはGPUが利用可能な環境でのみインストールしてください
# tensorflow-gpu==2.6.0

コメントを活用することで、チームメンバーや将来の自分にとって、依存関係の意図や注意点が明確になります。また、一時的に無効化したいパッケージをコメントアウトすることもできます。

○定期的な更新とメンテナンス

requirements.txtファイルは、プロジェクトの進行とともに定期的に更新する必要があります。新しいパッケージの追加や、既存のパッケージのバージョンアップデートを適切に管理することが重要です。

定期的な更新の手順としては、以下のようなものが考えられます。

  1. 現在の依存関係を確認する
pip freeze > current_requirements.txt
  1. 新しいバージョンの有無を確認する
pip list --outdated
  1. 必要に応じてパッケージをアップデートする
pip install --upgrade パッケージ名
  1. 更新後の依存関係を新しいrequirements.txtに反映する
pip freeze > new_requirements.txt
  1. 新旧のrequirements.txtファイルを比較し、変更点を確認する
  2. テストを実行し、アップデートによる影響がないことを確認する
  3. 問題がなければ、新しいrequirements.txtをコミットする

定期的な更新とメンテナンスにより、セキュリティパッチの適用や新機能の利用が可能になります。また、長期的なプロジェクトの健全性を維持することができます。

●よくあるエラーと対処法

requirements.txtを使用する際、いくつかの一般的なエラーに遭遇することがあります。

ここでは、よく発生するエラーとその対処法について解説します。

○パッケージの競合解決

複数のパッケージが互いに矛盾する依存関係を持っている場合、競合が発生することがあります。

例えば、パッケージAがライブラリXのバージョン1.0を要求し、パッケージBが同じライブラリXのバージョン2.0を要求している場合などです。

競合を解決するには、次の手順を試みることができます。

  1. 依存関係の詳細を確認する
pip install --no-deps パッケージ名
  1. 互換性のあるバージョンを探す
pip install "パッケージ名==互換性のあるバージョン"
  1. 必要に応じて、一方のパッケージをアップグレードまたはダウングレードする
  2. どうしても解決できない場合は、仮想環境を分けて管理することを検討する

○インストール失敗時のトラブルシューティング

パッケージのインストールに失敗する場合、様々な原因が考えられます。

よくある問題とその対処法を紹介します。

  1. インターネット接続の問題
  • ネットワーク接続を確認し、必要に応じてプロキシ設定を行う
  1. 権限の問題
  • 管理者権限で実行するか、ユーザーインストールを試みる
   pip install --user -r requirements.txt
  1. 依存関係の問題
  • 依存関係を無視してインストールを試みる
   pip install --no-dependencies -r requirements.txt
  1. バージョンの互換性問題
  • 互換性のあるバージョンを指定してインストールを試みる
   pip install "パッケージ名==互換性のあるバージョン"

○バージョン不整合の解決策

プロジェクトメンバー間でパッケージのバージョンが不整合を起こすことがあります。

バージョン不整合を解決するためには、次の方法が効果的です。

  1. 厳密なバージョン指定
   numpy==1.21.2
   pandas==1.3.3
  1. バージョン範囲の指定
   numpy>=1.21.0,<1.22.0
   pandas>=1.3.0,<1.4.0
  1. 仮想環境の使用
   python -m venv myenv
   source myenv/bin/activate  # Unix系の場合
   myenv\Scripts\activate.bat  # Windowsの場合
  1. pipのバージョン固定モードの使用
   pip install --only-binary=:all: -r requirements.txt
  1. バージョン管理ツールの導入(例:poetry, pipenv)

バージョン不整合を防ぐためには、チーム内で統一されたバージョン管理プラクティスを確立し、定期的なレビューとアップデートを行うことが重要です。

●requirements.txtの応用例

requirements.txtの基本的な使い方を理解したら、実際のプロジェクトでの応用方法を探ってみましょう。

大規模プロジェクト、マイクロサービスアーキテクチャ、データサイエンス、Webアプリケーションなど、様々な場面でrequirements.txtを効果的に活用できます。

それぞれの特性に合わせた活用法を見ていきましょう。

○サンプルコード14:大規模プロジェクトでの運用

大規模プロジェクトでは、複数のモジュールや機能が存在し、それぞれに異なる依存関係がある場合があります。

そんな時は、モジュールごとにrequirements.txtを分割し、必要に応じて結合する方法が効果的です。

プロジェクト構成の例

project/
    ├── module1/
    │   └── requirements.txt
    ├── module2/
    │   └── requirements.txt
    ├── module3/
    │   └── requirements.txt
    └── requirements.txt

各モジュールのrequirements.txtの例

# module1/requirements.txt
numpy==1.21.2
pandas==1.3.3

# module2/requirements.txt
Flask==2.0.1
SQLAlchemy==1.4.23

# module3/requirements.txt
tensorflow==2.6.0
scikit-learn==0.24.2

プロジェクト全体のrequirements.txtを生成するスクリプト

import os

def merge_requirements():
    all_requirements = set()
    for root, dirs, files in os.walk("."):
        if "requirements.txt" in files:
            with open(os.path.join(root, "requirements.txt"), "r") as f:
                all_requirements.update(f.read().splitlines())

    with open("requirements.txt", "w") as f:
        for req in sorted(all_requirements):
            f.write(f"{req}\n")

if __name__ == "__main__":
    merge_requirements()
    print("全てのrequirements.txtを結合しました。")

実行結果

全てのrequirements.txtを結合しました。

生成されたrequirements.txt

Flask==2.0.1
numpy==1.21.2
pandas==1.3.3
scikit-learn==0.24.2
SQLAlchemy==1.4.23
tensorflow==2.6.0

この方法を使えば、各モジュールの依存関係を個別に管理しつつ、プロジェクト全体の依存関係も簡単に把握できます。

○サンプルコード15:マイクロサービスアーキテクチャでの活用

マイクロサービスアーキテクチャでは、各サービスが独立して動作するため、サービスごとに異なる依存関係を持つことがあります。

requirements.txtを使って、各サービスの依存関係を明確に分離し、管理することができます。

プロジェクト構成の例

microservices/
    ├── auth_service/
    │   ├── Dockerfile
    │   └── requirements.txt
    ├── user_service/
    │   ├── Dockerfile
    │   └── requirements.txt
    └── product_service/
        ├── Dockerfile
        └── requirements.txt

各サービスのrequirements.txtの例

# auth_service/requirements.txt
Flask==2.0.1
PyJWT==2.1.0

# user_service/requirements.txt
Flask==2.0.1
SQLAlchemy==1.4.23

# product_service/requirements.txt
Flask==2.0.1
pymongo==3.12.0

Dockerfileの例(auth_serviceの場合)

FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "app.py"]

各サービスのDockerfileで、そのサービス固有のrequirements.txtを使用することで、必要最小限の依存関係だけをインストールできます。

これで、コンテナのサイズを小さく保ち、ビルド時間を短縮できます。

○サンプルコード16:データサイエンスプロジェクトでの利用

データサイエンスプロジェクトでは、多くの場合、Jupyter Notebookを使用します。

requirements.txtを使って、プロジェクトの依存関係を管理し、再現可能な環境を構築できます。

requirements.txtの例

jupyter==1.0.0
numpy==1.21.2
pandas==1.3.3
matplotlib==3.4.3
scikit-learn==0.24.2
seaborn==0.11.2

環境構築のスクリプト

import subprocess
import sys

def setup_environment():
    try:
        subprocess.check_call([sys.executable, "-m", "pip", "install", "-r", "requirements.txt"])
        print("環境構築が完了しました。")
    except subprocess.CalledProcessError:
        print("環境構築に失敗しました。エラーログを確認してください。")

if __name__ == "__main__":
    setup_environment()

実行結果

環境構築が完了しました。

Jupyter Notebookの最初のセルで、必要なライブラリをインポートできます。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

print("全てのライブラリが正常にインポートされました。")

出力

全てのライブラリが正常にインポートされました。

requirements.txtを使用することで、データサイエンスプロジェクトの再現性が向上し、チーム間での環境の統一が容易になります。

○サンプルコード17:WebアプリケーションのデプロイメントでのTips

Webアプリケーションをデプロイする際、requirements.txtは非常に重要な役割を果たします。

本番環境と開発環境で異なる依存関係を管理する方法を見てみましょう。

プロジェクト構成

webapp/
    ├── app/
    │   └── main.py
    ├── requirements.txt
    ├── requirements-dev.txt
    └── requirements-prod.txt

requirements.txt(共通の依存関係)

Flask==2.0.1
SQLAlchemy==1.4.23

requirements-dev.txt(開発環境用)

-r requirements.txt
pytest==6.2.5
flake8==3.9.2

requirements-prod.txt(本番環境用)

-r requirements.txt
gunicorn==20.1.0

デプロイメントスクリプト

import os
import subprocess
import sys

def deploy_app(environment):
    if environment not in ["dev", "prod"]:
        print("無効な環境です。'dev'または'prod'を指定してください。")
        return

    req_file = f"requirements-{environment}.txt"

    try:
        subprocess.check_call([sys.executable, "-m", "pip", "install", "-r", req_file])
        print(f"{environment}環境の依存関係をインストールしました。")

        if environment == "prod":
            subprocess.check_call(["gunicorn", "app.main:app"])
        else:
            os.environ["FLASK_ENV"] = "development"
            subprocess.check_call([sys.executable, "app/main.py"])

    except subprocess.CalledProcessError:
        print("デプロイメントに失敗しました。エラーログを確認してください。")

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("使用法: python deploy.py [dev|prod]")
    else:
        deploy_app(sys.argv[1])

実行例(開発環境)

$ python deploy.py dev
dev環境の依存関係をインストールしました。
 * Serving Flask app "main" (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

実行例(本番環境)

$ python deploy.py prod
prod環境の依存関係をインストールしました。
[2023-04-01 12:00:00 +0000] [12345] [INFO] Starting gunicorn 20.1.0
[2023-04-01 12:00:00 +0000] [12345] [INFO] Listening at: http://127.0.0.1:8000 (12345)
[2023-04-01 12:00:00 +0000] [12345] [INFO] Using worker: sync
[2023-04-01 12:00:00 +0000] [12346] [INFO] Booting worker with pid: 12346

環境ごとにrequirements.txtを分けることで、開発環境と本番環境の違いを明確に管理でき、不要なパッケージのインストールを避けることができます。

まとめ

requirements.txtは、Pythonプロジェクトの依存関係管理において非常に重要な役割を果たします。

基本的な使い方から応用的なテクニックまで、様々な方法で活用できることがわかりました。

本記事で紹介した17の活用法を参考に、自身のプロジェクトに合わせたベストプラクティスを確立してみてください。

依存関係管理の課題を克服し、より効率的で安定したPython開発を実現できるはずです。