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


94

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

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

私が達成しようとしているのはpip install、私のライブラリの1つが、その上流の依存関係のすべてをダウンロード/インストールすることです。私がpipのドキュメントで苦労しているのは、要件ファイルがそれ自体でこれを実行できるかどうか、またはそれらが実際にを使用するための単なる補足であるかどうかですinstall_requires

install_requiresすべてのライブラリで使用して依存関係とバージョン範囲を指定し、要件ファイルのみを使用して競合を解決したり、プロダクションビルド用にフリーズしたりしますか?

私が架空の世界に住んでいるとしましょう(わかっています、わかっています)。私の上流の依存関係は単純で、競合したり、下位互換性を壊したりしないことが保証されています。pip要件ファイルを使用するか、pip / setuptools / distributeですべてに基づいてすべてをインストールする必要がありますinstall_requiresか?

ここには同様の質問がたくさんありますが、どちらか一方を使用したり、両方を調和して使用したりする場合ほど基本的なものは見つかりませんでした。


3
これは、2つの関係、およびそれらの統合方法を説​​明する非常に優れた記事です。
ビョルンPollex

回答:


68

私の哲学はinstall_requires、最低限必要なものを示すことです。一部のバージョンが機能しないことがわかっている場合は、バージョン要件が含まれる場合があります。しかし、わからないバージョン要件はありません(たとえば、依存関係の将来のリリースでライブラリが壊れるかどうかわからないなど)。

一方、要件ファイルは、動作することがわかっいることを示す必要があり、推奨されるオプションの依存関係を含めることができます。たとえば、SQLAlchemyを使用してMySQLを提案し、MySQLdbを要件ファイルに含めることができます。

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


5
これは、setup.py install_requires=dep をミラーリングする必要があるという意味requirements.txtですか?
proppy

9
setup.pyの要件と要件ファイルの両方を持つことは危険です。なぜなら、複製は同期を外すことを要求するだけだからです。
Sebastian Blask 2013年

1
また、実際にどのように操作していますか?要件ファイルを1回使用して、確実に機能している状態になると思います。次に、pipを使用して実際のパッケージをインストールします。-U要件ファイルの依存関係が上書きされる可能性があるため、使用できなくなりますか?どのようにアップグレードしますか?
Sebastian Blask 2013年

1
この回答はアプリケーションとパッケージに等しく適用されますか?my-web-app(アプリ)がsome-tool(パッケージ)に依存していることを想像してください。どちらもリクエストパッケージに依存しています。一部のツールに、要求の特定のバージョンまたはバージョン範囲をピン留めするrequirements.txtファイルがある場合、競合するバージョン/バージョン範囲を指定している可能性があるmy-web-appに潜在的な問題が発生するように思われます。
リース14年

2
パッケージをインストールする唯一の方法があるはずです。そのため、他の貢献者を混乱させたくない場合を除いて、両方を持つことはお勧めしません。
Gewthen、2015年

17

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

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

setup(
    .....
    install_requires=REQUIREMENTS
)

20
注意してください、要件ファイルにはコメントやインクルージョンが含まれる可能性があります。ピップパーサーを使用する必要があります
Romain Hardouin 2013年

1
はい、最終的にこれを変更してコメントを削除しました。ピップパーサーは私の答えよりもよく見えます。
rbp

7
要件ファイルがすべてsetup.pyに含まれているのに、なぜ要件ファイルを使用するのですか?
Sebastian Blask

2
@RomainHardouinは、リンクされた回答へのコメントで述べられているように、pipはそのように使用するためのものではありません。
akaihola 2014年

1
ええ、これは--extra-index-url、要件でのクリティカルが要求されて、これが私の顔で爆発するまで、私にとってはうまくいきました。ありがとう@RomainHardouin
Tommy

11

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-pypiを見ていないrequirements.txtだけで、install_requires


5

私は今まで setup.pyしてinstall_requires見て唯一の場所がありますので。要件ファイルを持っているのと同じくらい強力で、維持する重複はありません。


問題は、どちらを使用するかです。詳しくは説明しませんでしたが、私の答えは、常にどちらか一方を使用し、もう一方は使用しないことです。それが質問に答えないのはなぜですか?
Sebastian Blask、2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.