web-dev-qa-db-ja.com

setup.pyでpip要件ファイルとinstall_requiresを使用する場合

Virtualenvでpipを使用して、いくつかのPythonライブラリをパッケージ化およびインストールします。

私がやっていることはかなり一般的なシナリオだと思います。私は依存関係を明示的に指定できるいくつかのライブラリのメンテナーです。私のライブラリのいくつかは、私が制御できない推移的な依存関係を持つサードパーティのライブラリに依存しています。

私が達成しようとしているのは、ライブラリのいずれかでpip installを使用して、そのアップストリームの依存関係をすべてダウンロード/インストールすることです。私がpipドキュメントで苦労しているのは、if/how requirements files がこれを自分で行うことができるか、実際にinstall_requiresを使用するだけの補足であるかです。

すべてのライブラリでinstall_requiresを使用して依存関係とバージョン範囲を指定し、要件ファイルを使用して競合を解決するか、本番ビルド用にそれらをフリーズするだけですか?

私が想像上の世界に住んでいるふりをしましょう(私は知っている、知っている)、私のアップストリームの依存関係は単純であり、決して後方互換性を衝突したり壊したりしないことが保証されています。 pip要件ファイルを使用することを余儀なくされますか、それともpip/setuptools/distributeにinstall_requiresに基づいてすべてをインストールさせますか?

ここには似たような質問がたくさんありますが、どちらか一方を使用するか、両方を一緒に使用するときほど基本的なものは見つかりませんでした。

84
Joe Holloway

私の哲学はinstall_requiresは、必要なものの最小値を示す必要があります。 knowいくつかのバージョンが機能しない場合、バージョン要件が含まれる場合があります。不明なバージョン要件はないはずです(たとえば、依存関係の将来のリリースがライブラリを壊すかどうかはわかりません)。

一方、要件ファイルは、あなたが知っていることを示しているはずですdoes workであり、推奨するオプションの依存関係を含めることができます。たとえば、SQLAlchemyを使用するが、MySQLを推奨するため、MySQLdbを要件ファイルに追加します。

したがって、要約すると:install_requiresは、機能しないことがわかっているものから人々を遠ざけることであり、要件ファイルは、機能することを知っているものに人々を導くための要件ファイルです。この理由の1つは、install_requires要件はalwaysチェックであり、実際にパッケージのメタデータを変更しないと無効にできません。したがって、新しい組み合わせを簡単に試すことはできません。要件ファイルはインストール時にのみチェックされます。

66
Ian Bicking

ここに私がsetup.pyに入れたものがあります:

# this grabs the requirements from requirements.txt
REQUIREMENTS = [i.strip() for i in open("requirements.txt").readlines()]

setup(
    .....
    install_requires=REQUIREMENTS
)
13
rbp

Python Packaging User Guideには、このトピックに関するページがあります。ぜひお読みください。

概要:

install_requiresは、パッケージが機能するために絶対にインストールする必要があるパッケージの依存関係をリストするためにあります。特定のバージョンへの依存関係を固定するためのものではありませんが、install_requires=['Django>=1.8']などの範囲は受け入れられます。 install_requiresは、pip install name-on-pypiおよびその他のツールによって監視されます。

requirements.txtは単なるテキストファイルであり、pip install -r requirements.txtの実行を選択できます。 Django==1.8.1のように、すべての依存関係と下位依存関係のバージョンを固定することを意図しています。 pip freeze > requirements.txtを使用して作成できます。 (Herokuなどの一部のサービスは、自動的にpip install -r requirements.txtを実行します。)pip install name-on-pypirequirements.txtを参照せず、install_requiresのみを参照します。

8
Flimm

私は今までsetup.pyおよびinstall_requires見る場所が1つしかないため。要件ファイルを保持するのと同じくらい強力であり、維持する重複はありません。

5
Sebastian Blask