ビルドシステムインターフェース¶
パッケージのインストール可能なソースディストリビューションを扱う場合、pip はパッケージのビルドプロセスを直接処理しません。この責任は「ビルドバックエンド」、別名「ビルドシステム」に委任されます。つまり、pip にはこれらのビルドバックエンドと対話するためのインターフェースが必要です。
pip がこれらの相互作用に使用する主なインターフェースは2つあります
pyproject.toml
ベースビルド依存関係の明示的な宣言と管理を備えた、標準に基づいたインターフェース。
setup.py
ベースユーザーの移行を進めているレガシーインターフェース。ビルド依存関係を宣言するための適切なメカニズムがありません。
個々のインターフェースの詳細については、上記にリンクされている専用ページを参照してください。このドキュメントでは、pip がプロジェクトに使用するビルドシステムインターフェースに関するニュアンスと、pip が使用する可能性のあるすべてのビルドシステムインターフェースに適用される詳細について説明します。
使用されるビルドシステムインターフェースの決定¶
現在、pip は pyproject.toml
ファイルが存在する場合、pyproject.toml
ベースのビルドシステムインターフェースを使用します。存在しない場合は、レガシービルドシステムインターフェースが使用されます。目的は、無条件に pyproject.toml
ビルドシステムインターフェースを使用するように切り替え、将来のある時点でレガシービルドシステムインターフェースのサポートを終了することです。
ビルドを実行する場合、pip は使用しているビルドシステムインターフェースについて言及します。通常、これは次のようなメッセージの形式になります。
Building wheel for pip (pyproject.toml)... done
Building wheel for pip (setup.py)... done
括弧内のコンテンツは、使用されているビルドシステムインターフェースを指します。
バージョン 21.3 で変更: 出力では、pyproject.toml
ベースのビルドシステムインターフェースを参照するために、「PEP 517」ではなく「pyproject.toml」を使用します。
使用されるビルドシステムインターフェースの制御¶
--use-pep517
フラグ (および対応する環境変数: PIP_USE_PEP517
) を使用すると、すべてのパッケージが pyproject.toml
ベースのビルドシステムインターフェースを使用してビルドされるように強制できます。レガシービルドシステムインターフェースの使用を強制する方法はありません。
setup_requires
の制御¶
ヒント
これは、ビルドバックエンドとして setuptools を使用し、setup.py ファイルで setup_requires
キーワード引数を使用するプロジェクトにのみ関連します。
setup.py
の setup_requires
引数は、パッケージのビルド時依存関係を指定するために使用されます。これは、pyproject.toml
ファイルの build-system.requires
キー ( PEP 518 に基づく) に置き換えられました。ただし、setup_requires
を使用するパッケージに遭遇する可能性のある状況があります (例: パッケージが新しいアプローチを使用するようにまだ更新されていない場合!)。
パッケージを制御する場合は、pyproject.toml
ファイルを追加して、最新のビルドシステムインターフェースを利用することを検討してください。これにより、インストールを pip に委ねることで、問題のある動作を回避できます。
エンドユーザーにとって、setup_requires
を使用するパッケージに対処するための最善の解決策は、以前の pip install
コマンドを使用して、setup_requires
にリストされているパッケージを事前にインストールすることです。これは、easy_install
がこれらの依存関係をどのように特定するか、または setuptools が pip のコマンドラインオプションを使用して pip
をどのように呼び出すかを制御する方法がないためです。これにより、適切に動作させることが難しくなります。
easy_install
の呼び出しが PyPI に到達しないようにする場合は、distutils
設定ファイルを使用してその動作を設定する必要があります。次にいくつかの例を示します。
easy_install
で別のインデックスに依存関係を配置するには[easy_install] index_url = https://my.index-mirror.com
PyPI をクロールせずに、ローカルディレクトリから依存関係を配置するには、これを追加します。
[easy_install] allow_hosts = '' find_links = file:///path/to/local/archives/
歴史的背景
setuptools < 52.0
は、setup_requires
依存関係を満たそうとするために easy_install
を使用します。これにより、奇妙な障害が発生する可能性があります。 easy_install
は最新の Python パッケージング標準の多くを理解しておらず、通常、互換性のないパッケージバージョンをインストールしたり、パッケージを誤ってビルドしたりしようとします。また、多くの状況で適切に機能しない不適切なスクリプトラッパーを生成します。
新しいバージョンの setuptools
は、これらのインストールに pip
を使用しますが、コマンドライン引数を渡す機能は限られています。これにより、奇妙な障害やわずかに不正確な動作が発生する可能性もあります。