requirements.txt と setuptools の install_requires は、どちらを使うべきですか


Python のパッケージを配布する際、依存するパッケージを指定するのに `requirements.txt` と、 `setuptools` の
`install_requires` オプションを利用する方法の二種類があります。 どちらの方法がより一般的で推奨されているのでしょうか。




setuptoolsの`install_requires`を使うべきです。

`requirements.txt`と`install_requires`では現時点では目的が異なっています。setup.pyに指定したinstall_requiresはパッケージ化の際にメタデータとしてパッケージに同梱されます。
`requirements.txt`を同梱してもそのような動作にはなりません。そのため、利用者が`pip install
hogehoge`としてそのパッケージをインストールしたときに正しく依存パッケージをインストールできるのは
`install_requires`を設定した場合です。また、メタデータはPythonのPEP345やPEP426でフォーマットと項目が規定されている標準仕様です。

`requirements.txt`は`Requirementsフォーマット`と呼ばれる形式でインストールするパッケージを列挙します。このフォーマットにはpipのオプション(`-f`や`-r`)などを含むことが出来ます。Requirementsフォーマットで記述されたrequirements.txtが将来PEPで標準化される可能性はありますが、現時点では標準化されていません。とはいえ現時点でも、様々なサービスがrequirements.txtをデファクトスタンダードと認めているためか、テスト環境の構築時などにこのファイルを認識して利用してくれます。

パッケージングという観点でいえば、`setuptools`の`install_requires`を利用するべきでしょう。
そのパッケージ自体の開発環境やテスト環境の構築という観点でいえば、`requirements.txt`を動作保証するバージョン指定付きで（一般的には`pip
freeze > requirements.txt`で作成して）リポジトリに同梱することが推奨されます。




setuptoolsの`install_requires`を使うべきです。

`requirements.txt`と`install_requires`では現時点では目的が異なっています。setup.pyに指定したinstall_requiresはパッケージ化の際にメタデータとしてパッケージに同梱されます。
`requirements.txt`を同梱してもそのような動作にはなりません。そのため、利用者が`pip install
hogehoge`としてそのパッケージをインストールしたときに正しく依存パッケージをインストールできるのは
`install_requires`を設定した場合です。また、メタデータはPythonのPEP345やPEP426でフォーマットと項目が規定されている標準仕様です。

`requirements.txt`は`Requirementsフォーマット`と呼ばれる形式でインストールするパッケージを列挙します。このフォーマットにはpipのオプション(`-f`や`-r`)などを含むことが出来ます。Requirementsフォーマットで記述されたrequirements.txtが将来PEPで標準化される可能性はありますが、現時点では標準化されていません。とはいえ現時点でも、様々なサービスがrequirements.txtをデファクトスタンダードと認めているためか、テスト環境の構築時などにこのファイルを認識して利用してくれます。

パッケージングという観点でいえば、`setuptools`の`install_requires`を利用するべきでしょう。
そのパッケージ自体の開発環境やテスト環境の構築という観点でいえば、`requirements.txt`を動作保証するバージョン指定付きで（一般的には`pip
freeze > requirements.txt`で作成して）リポジトリに同梱することが推奨されます。

