こんにちは、吉政創成 菱沼です。
今回もPythonエンジニア育成推進協会のPython 3 エンジニア認定実践試験の主教材「Python実践レシピ/技術評論社」を使って学びたいと思います。
前回は、requirements.txtを使って複数の環境でパッケージのバージョンを統一する方法について学習しました。
今回は、requirements.txtを使ってインストールする際、そのバージョンに制限を掛ける方法について学習します。なお、私はWindowsを利用しています。
特定のパッケージのバージョンを制限する理由と方法
requirements.txtには、同じ環境を作るために、インストールするパッケージのバージョンを指定する内容を書きました。
一方、今回学習するconstraints.txtは、requirements.txtで指定したパッケージの中で、インストールするバージョンを制限することができるものだそうです。そのため、それだけではパッケージをインストールできないので、requirements.txtと一緒に使うことが前提になります。
まずは具体的にどう使うものかテキストから引用します。
——————————-
P.6
「pip install -r requirements.txt」コマンドに-cオプションを加えることで、requirements.txtでインストールされるパッケージのバージョンに制限を掛けられます。-cオプションにはパッケージ名とバージョン番号を書いたテキストファイルを指定します(書き方はrequirements.txtと同じです)。ファイル名は慣例としてconstraints.txtが使われます。
この機能は、どんな開発でも必要なものではありません。以下の2つの条件を満たす場合に使用を検討してください。
・複数のアプリケーションを開発している
・すべてのアプリケーションで特定パッケージのバージョンを統一したい
——————————-
バージョンを制限する必要があるのかと言えば、互換性の確保や環境依存のバグを減らす、パッケージのバージョン間の衝突などを防止する、テストの信頼性向上などの理由があるそうです。
ならば、そもそもrequirements.txtでパッケージに制限をかけるのではだめなのか?と思い、ChatGPTに聞いてみたところ、「numpy>=1.18.0,<2.0.0」「requests==2.25.1」と書くことでrequirements.txtだけで制限をかけることはできるけれども、柔軟性に欠けるんだそうです。
例えば、複数のプロジェクトが一つの環境で動いていた場合、requirements.txtもそのプロジェクト分用意することになります。この時、依存関係にあるパッケージのバージョンを同じものにしたいとなれば、constraints.txtで指定した方が効率的であるということのようです。また、一時的に複数のパッケージのバージョンを統一したい場合もconstraints.txtを使えば楽に行えるようです。
特定のパッケージのバージョンを制限する理由と方法
では次に、具体的にどんなシーンで利用するのか、そしてその使用方法です。
——————————-
P.6
ある開発チームが3種類のアプリケーションを開発しているケースを見てみましょう。各アプリケーションでは依存するパッケージとバージョンが少しだけ違っています。
アプリケーション名 | 依存するPythonパッケージとバージョン |
アプリケーションA | dateutil 2.8.1、SQLAlchemy 1.4.20、pycopg2-binary 2.9.1 |
アプリケーションB | dateutil 2.8.0、SQLAlchemy 1.4.17、pycopg2-binary 2.9.1 |
アプリケーションC | dateutil 2.8.1 |
この開発チームは、pycopg2-binaryを使う場合、バージョンは必ず2.9.1を使うことがルールとして決まっているものとします。現状では、アプリケーションAとアプリケーションBはpycopg2-binaryのバージョンを統一しなければなりません。アプリケーションCはpycopg2-binaryに依存していないのでバージョンの統一は必要ありませんが、あとでpycopg2-binaryが必要になった場合は、当然2.9.1を使うようにしなければなりません。
まず、以下のconstraints.txtを用意して、すべてのアプリケーションの直下に置きます。
psycopg2-binary==2.9.1 |
——————————-
requirements.txtと、constraintts.txtは同じディレクトリに一つずつ用意する必要があるようです。
constraints.txtには、インストールするかどうかは関係なく、バージョンを指定したいパッケージのすべてをバージョン番号付きで記載します。一般的には freeze で出力した、関連パッケージを含むインストールされているものすべて書くそうです。
そして、requirements.txtに書くのは必要なパッケージ名のみで、依存関係でインストールされるものは書かないとのこと。
今回の例でrequirements.txtに書かれる内容は、引用文の表内に書かれているパッケージ名になります。ただ、バージョンの管理をconstraints.txtで統一して指定されるので、バージョンは書く必要がないようです。
参考例として、アプリケーションAに用意されるrequirements.txtの項目だけ引用しておきます。
引用:アプリケーションAのrequirements.txt
python-dateutil SQLAlchemy psycopg2-binary |
そして、作った後、
pip install -r requirements.txt -c constraints.txt |
を実行すれば、引用文の環境が完成します。
完了後、きちんとインストールできているか、確認するには以下を実行します。
pip list |
実行して、一覧に対象のパッケージ名が表示されていれば成功です!
それではきりが良いので、今回はこちらで終了です。
お付き合いいただきありがとうございました。
実践試験について知りたい方は以下をご覧ください。
●Python3エンジニア認定実践試験
https://www.pythonic-exam.com/exam/jissen