ビルドシステムインターフェース

パッケージのインストール可能なソースディストリビューションを扱う場合、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.pysetup_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 を使用しますが、コマンドライン引数を渡す機能は限られています。これにより、奇妙な障害やわずかに不正確な動作が発生する可能性もあります。