初めてのPython実践試験学習 第四回「constraints.txtでパッケージのインストールバージョンに制限をかける」

こんにちは、吉政創成 菱沼です。

今回も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パッケージとバージョン
アプリケーションAdateutil 2.8.1、SQLAlchemy 1.4.20、pycopg2-binary 2.9.1
アプリケーションBdateutil 2.8.0、SQLAlchemy 1.4.17、pycopg2-binary 2.9.1
アプリケーションCdateutil 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

PAGE TOP