注記

ドキュメントのこのセクションは現在執筆中です。pip開発者は、このドキュメントを完成させるためにあなたの協力を歓迎します。協力に興味がある場合は、追跡issueでお知らせください。

広範な機能概要

pipはパッケージインストーラーです。

pipはインストール以上のことを行います。キャッシュ、設定、独自の癖を持つCLIも備えています。しかし、主に

pipが行うこと

  1. 必要に応じて(ソース配布パッケージの場合、パッケージがホイールの場合は必要ありません)、パッケージの構築を管理します(パッケージ構築をバックエンドにオフロードします)。
    1. デフォルトでは、pipは下位互換性の理由から、パッケージの構築をsetuptoolsに委任します。しかし、setuptoolsはsetup.pyファイルを持ち、それを呼び出して……情報を取得しますか?
  2. どこにインストールするかを決定します。パッケージが構築されると、結果として得られる成果物は、適切な場所にあるシステムにインストールされます。PEP 517は、ビルドバックエンドとインストーラー間のインターフェースを定義します。

フローの概要

順序として、pipは何をしますか?

  1. ユーザー入力(ユーザーが要求するパッケージを示すユーザー提供の文字列)を取得します。

  2. それが何を意味するのかを把握します。ユーザーが要求したものを正確に把握し、pipが操作できるものに変換します(ユーザー入力を要件に変換)。

  3. おそらく、プロセス全体の核心は?ステップ2から要件のセットを取得したら、それらを具体的な「インストールするもの」に展開する必要があります。ユーザーが指定した要件に基づいてインストールする必要があるその他の要件と、それらをどこから取得するかを把握します。

    1. このステップは複雑であり、探索的でもあり、依存関係が関与します。

      解決が必要です。インデックスにアクセスして、利用可能なバージョンを確認する必要があります。

    2. 依存関係情報を取得するために、パッケージ自体を構築する必要がある場合があります。

      つまり、パッケージインデックスからパッケージを取得する必要があります。つまり、それが存在するかどうかを知る必要があります。単一のパッケージの場合、

  4. インストールする実際の項目をインストールします。

なぜか?pipはPyPI以外の場所からインストールします!また、これまでPyPIのJSON APIを保証したことがないため、パッケージ自体をダウンロードすることなくPyPIからメタデータを取得した人は誰もいません。

インストールプロセスのフローに関して

  1. 1つのパッケージの場合:そのパッケージの抽象的な要件を取得し、それが何を意味するのかを調べようとします(この抽象的な要件はさまざまな形式を取ることができます)。抽象的な依存関係を定義します。

  2. 「このパッケージをここから取得し、このパッケージのそのバージョンである」というセットができたら、

  3. それらのものをインストールするために環境を変更します(つまり、ファイルを正しい場所に配置します)。たとえば、すでに要件のバージョン6.0があり、7.2をインストールする場合、6.0をアンインストールして7.2をインストールします。

ダウンロードプロセス

インストールで何が起こるか?まあ、installのサブセット。通常、pipはpip install中に実行するプロセスは、downloadです(pip downloadコマンドとしてユーザーも利用できます)。また、マニフェストを取得するためにパッケージをダウンロードして検査します。特定のパッケージ名について、利用可能なファイルとファイル名を知る必要があります。

pipは、Pythonパッケージリポジトリからダウンロードできます。パッケージは構造化された形式で保存されており、pipのようなインストーラーが見つけることができます。

PEP 503は、Pythonパッケージリポジトリと通信するために使用するAPIを定義します。

PyPI

他に引数なしでpip download somepackageを実行するとどうなりますか?デフォルトでは、PyPIを参照します。これは、pipがsomepackageについてパッケージインデックスが知っていることをさらに詳しく調べる場所です。

pipは、利用可能なファイルとファイル名を知っています。

言い換えれば

すべての依存関係が解決されるまで、以下を実行します。

  1. PEP 503で定義されたAPIに従って、http://{pypi_index}/simple/{package_name}からインデックスページを取得します。

  2. ページからすべてのファイルリンクを解析します。

  3. リンクのリストからダウンロードする単一のファイルを選択します。

  4. ダウンロードしたパッケージからメタデータを抽出します。

  5. メタデータに基づいて依存関係ツリーを更新します。

パッケージインデックスは、そのパッケージのファイルのリストをpipに提供します(既存のPyPI API経由)。ファイルにはバージョンとその他の情報が含まれており、pipがダウンロードする必要があるかどうかを判断するのに役立ちます。

pipは、リストからダウンロードする単一のファイルを選択します。

戻って別のファイルをダウンロードすることもあります。

pipがパッケージインデックスを参照すると、参照する場所には基本的にリンクがあります。リンクのテキストはファイルの名前です。

これは、PyPI Simple APIです(PyPIにはいくつかのAPIがあり、一部は非推奨になっています)。pipは、最初にPEP 503で文書化されたSimple APIを参照します。packaging.python.orgには、Simple Repository APIの詳細が記載されたPyPA仕様があります。

このパッケージ名の場合、これが利用可能なファイルのリストです。

そこで探します

  • ファイル名のリスト

  • その他の情報

それらを入手したら、1つのファイルを選択してダウンロードします。

(質問:pip install flaskを実行したい場合、ファイル名のリスト全体が……そうすべきではない?私はFlaskだけが欲しい……なぜリスト全体を取得するのですか?

回答:すべてのファイルではなく、Flaskのファイルだけです。PyPIのすべてのファイルを取得するためのAPIはありません。Flaskのすべてのファイルを取得するためのものです。)