install_requires vs Requirements files

Page Status:Complete
Last Reviewed:2015-09-08

install_requires

install_requiressetuptools setup.py のキーワードで、プロジェクトが正しく動くのに 最低限 必要なものを指定するのに使う。pip がプロジェクトをインストールする際、これに従って依存関係がインストールされる。

例えば、プロジェクトが A と B を必要とするなら、 install_requires はこのようになる:

install_requires=[
   'A',
   'B'
]

加えて、バージョンの下限と上限があればそれを示すのがベストプラクティスだ。

例えば、プロジェクトが最低でも ‘A’ の v1, および ‘B’ の v2 を必要とするとわかっているなら、このようにする:

install_requires=[
   'A>=1',
   'B>=2'
]

A が semantic versioning を使っており、’A’ の v2 が互換性を破っていることもわかっているなら、v2 を許可しないのは理にかなっている:

install_requires=[
   'A>=1,<2',
   'B>=2'
]

install_requires を使って依存関係を特定バージョンに固定したり、サブ依存関係(依存関係のさらに依存関係)を指定するのはベストプラクティスとはいえない。これは制約が厳しすぎるし、ユーザが依存関係をアップグレードするのを妨げる。

最後に、 install_requires は「抽象」requirements のリストであることを理解するのが重要だ。つまり、名前とバージョンに関する制約を記述するだけで、その依存関係がどの場所(インデックスやソース)から満たされるかは指定しないということだ。その場所(「具体化」)はインストール時に pip オプションを使って決定される。

Requirements files

Requirements Files は、最も簡単に説明すると、単に pip install への引数リストをファイルに格納したものだ。

install_requires はプロジェクト単独の依存関係を定義するが、 Requirements Files はしばしば完全な Python 環境の要件を定義するのに使われる。

install_requires の要件は最小限だが、requirements files は完全な環境の repeatable installations を実現するために固定されたバージョンの完全なリストを含むことがしばしばある。

install_requires の要件は「抽象」(つまり、特定のインデックスに関連付けられていない)だが、requirements files はしばしば --index-url--find-links のような pip オプションを含んでおり、要件を「具体化」(特定のインデックスやパッケージディレクトリに関連付け)している。 [1]

install_requires メタデータは pip がインストール中に自動解析するが、requirements files はそうではない。requirements files が使われるのは、ユーザが pip install -r でインストールするときだけだ。


[1]「抽象」「具体」要件に関する詳細は、 https://caremad.io/2013/07/setup-vs-requirement/ を見よ。