316


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


CC BY-SA 3.0
2014-12-02T00:28:41.577
209
2014-12-16T03:47:45.233
141
question
python
requirements.txt と setuptools の install_requires は、どちらを使うべきですか


これから先、Python2.7あるいは3.4以上で動作すれば良いという状況であればpipの`requirements.txt`を使うべきです。

`requirements.txt`の特徴として、以下の点が挙げられます。

  * 公式パッケージ配布サイト[PyPI](https://pypi.python.org/pypi)に登録されていないパッケージへの依存も、URLを書くことにより記述できる
  * そのため、TravisCIなどの近年出てきたサービスは`requirements.txt`を前提としている
  * 標準に取り込まれた 参考: [Python3.4からpipが標準インストーラに！？](http://qiita.com/ksato9700/items/c5a6db9d17ad0770a747)
  * `pip`パッケージを利用すれば、`setup.py`から読みだして使うことができる 参考: [How can I reference requirements.txt for the install_requires kwarg in setuptools' setup.py file?](https://stackoverflow.com/questions/14399534/how-can-i-reference-requirements-txt-for-the-install-requires-kwarg-in-setuptool)

もし古いPythonで`pip`がインストールされていない環境でも利用したい、かつ、PyPIに登録されているパッケージだけで良い、ということであれば、`install_require`を利用するほうが良いでしょう。

追記: pipとsetuptoolsも含めた詳しい比較のページがあります（英語ですが） 参考: [Concepts &
Analyses](https://python-packaging-user-
guide.readthedocs.org/en/latest/technical.html#requirements-files-vs-setup-py)


CC BY-SA 3.0
2014-12-02T03:43:35.643
226
2014-12-02T03:49:46.547
2017-05-23T12:38:55.307
-1
349
209
answer


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`で作成して）リポジトリに同梱することが推奨されます。


CC BY-SA 3.0
2014-12-03T13:33:41.413
316
2014-12-03T13:33:41.413
806
209
answer


パッケージを配布する場合に、 pip freeze が出力する requirements をそのまま利用してはいけません。 理由は以下のとおりです。

  * テスト自動化やスタイルチェックなど、開発時に使う、そのパッケージが実際には依存していないパッケージまで含まれてしまう可能性がある。
  * マイクロバージョンまで詳細に指定されてしまい、複数のパッケージが同じパッケージのバージョン違いに依存するという dependency hell を引き起こす。

Python の有名なライブラリは、マイクロバージョンでは互換性を壊さない用に注意されているので、自分が作成したパッケージを配布するときには
setup.py の install_requirements でのバージョン指定をしないか、緩くすることで、 dependency hell
を避ける事ができます。

pip freeze は、 Web
アプリケーションをデプロイするときなど、開発環境で検証された構成と同じ構成をステージング・本番環境で作りたい場合などに有効です。


CC BY-SA 3.0
2014-12-16T03:47:45.233
1656
2014-12-16T03:47:45.233
3019
209
answer