1. ホーム
  2. python

[解決済み] 新しいpip backtrackingの実行時問題の解決

2022-07-22 19:47:32

質問

その 新しいpip依存性リゾルバ は、パッケージのインストールに不適切なほど長い時間をかけます。 昨日の私たちの CI パイプラインでは、以前は ~10 分かかっていた docker ビルドが、このような pip のインストール メッセージが 1 時間続いた後にタイムアウトしました (ほぼすべての依存関係によってインストールされるライブラリに、同様のログ出力があります)。

INFO: pip is looking at multiple versions of setuptools to determine which version is compatible with other requirements. This could take a while.
  Downloading setuptools-50.0.0-py3-none-any.whl (783 kB)
  Downloading setuptools-49.6.0-py3-none-any.whl (803 kB)
  Downloading setuptools-49.5.0-py3-none-any.whl (803 kB)
  Downloading setuptools-49.4.0-py3-none-any.whl (803 kB)
  Downloading setuptools-49.3.2-py3-none-any.whl (790 kB)
INFO: This is taking longer than usual. You might need to provide the dependency resolver with stricter constraints to reduce runtime. If you want to abort this run, you can press Ctrl + C to do so. To improve how pip performs, tell us what happened here: https://pip.pypa.io/surveys/backtracking
  Downloading setuptools-49.3.1-py3-none-any.whl (790 kB)
  Downloading setuptools-49.3.0-py3-none-any.whl (790 kB)
  Downloading setuptools-49.2.1-py3-none-any.whl (789 kB)
  Downloading setuptools-49.2.0-py3-none-any.whl (789 kB)
  Downloading setuptools-49.1.3-py3-none-any.whl (789 kB)
  Downloading setuptools-49.1.2-py3-none-any.whl (789 kB)
  Downloading setuptools-49.1.1-py3-none-any.whl (789 kB)
  Downloading setuptools-49.1.0-py3-none-any.whl (789 kB)
  Downloading setuptools-49.0.1-py3-none-any.whl (789 kB)
  Downloading setuptools-49.0.0-py3-none-any.whl (789 kB)
  Downloading setuptools-48.0.0-py3-none-any.whl (786 kB)
  Downloading setuptools-47.3.2-py3-none-any.whl (582 kB)
  Downloading setuptools-47.3.1-py3-none-any.whl (582 kB)
  Downloading setuptools-47.3.0-py3-none-any.whl (583 kB)
  Downloading setuptools-47.2.0-py3-none-any.whl (583 kB)
  Downloading setuptools-47.1.1-py3-none-any.whl (583 kB)
  Downloading setuptools-47.1.0-py3-none-any.whl (583 kB)
  Downloading setuptools-47.0.0-py3-none-any.whl (583 kB)
  Downloading setuptools-46.4.0-py3-none-any.whl (583 kB)
  Downloading setuptools-46.3.1-py3-none-any.whl (582 kB)
  Downloading setuptools-46.3.0-py3-none-any.whl (582 kB)
  Downloading setuptools-46.2.0-py3-none-any.whl (582 kB)
  Downloading setuptools-46.1.3-py3-none-any.whl (582 kB)
  Downloading setuptools-46.1.2-py3-none-any.whl (582 kB)
  Downloading setuptools-46.1.1-py3-none-any.whl (582 kB)
  Downloading setuptools-46.1.0-py3-none-any.whl (582 kB)
  Downloading setuptools-46.0.0-py3-none-any.whl (582 kB)
  Downloading setuptools-45.3.0-py3-none-any.whl (585 kB)
  Downloading setuptools-45.2.0-py3-none-any.whl (584 kB)
  Downloading setuptools-45.1.0-py3-none-any.whl (583 kB)
  Downloading setuptools-45.0.0-py2.py3-none-any.whl (583 kB)
  Downloading setuptools-44.1.1-py2.py3-none-any.whl (583 kB)
  Downloading setuptools-44.1.0-py2.py3-none-any.whl (583 kB)
  Downloading setuptools-44.0.0-py2.py3-none-any.whl (583 kB)
  Downloading setuptools-43.0.0-py2.py3-none-any.whl (583 kB)
  Downloading setuptools-42.0.2-py2.py3-none-any.whl (583 kB)
  Downloading setuptools-42.0.1-py2.py3-none-any.whl (582 kB)
  Downloading setuptools-42.0.0-py2.py3-none-any.whl (582 kB)
  Downloading setuptools-41.6.0-py2.py3-none-any.whl (582 kB)
  Downloading setuptools-41.5.1-py2.py3-none-any.whl (581 kB)
  Downloading setuptools-41.5.0-py2.py3-none-any.whl (581 kB)
  Downloading setuptools-41.4.0-py2.py3-none-any.whl (580 kB)
  Downloading setuptools-41.3.0-py2.py3-none-any.whl (580 kB)
  Downloading setuptools-41.2.0-py2.py3-none-any.whl (576 kB)
  Downloading setuptools-41.1.0-py2.py3-none-any.whl (576 kB)
  Downloading setuptools-41.0.1-py2.py3-none-any.whl (575 kB)
  Downloading setuptools-41.0.0-py2.py3-none-any.whl (575 kB)
  Downloading setuptools-40.9.0-py2.py3-none-any.whl (575 kB)
  Downloading setuptools-40.8.0-py2.py3-none-any.whl (575 kB)
  Downloading setuptools-40.7.3-py2.py3-none-any.whl (574 kB)
  Downloading setuptools-40.7.2-py2.py3-none-any.whl (574 kB)
  Downloading setuptools-40.7.1-py2.py3-none-any.whl (574 kB)
  Downloading setuptools-40.7.0-py2.py3-none-any.whl (573 kB)
  Downloading setuptools-40.6.3-py2.py3-none-any.whl (573 kB)
  Downloading setuptools-40.6.2-py2.py3-none-any.whl (573 kB)
  Downloading setuptools-40.6.1-py2.py3-none-any.whl (573 kB)
  Downloading setuptools-40.6.0-py2.py3-none-any.whl (573 kB)
  Downloading setuptools-40.5.0-py2.py3-none-any.whl (569 kB)
  Downloading setuptools-40.4.3-py2.py3-none-any.whl (569 kB)
  Downloading setuptools-40.4.2-py2.py3-none-any.whl (569 kB)
  Downloading setuptools-40.4.1-py2.py3-none-any.whl (569 kB)
  Downloading setuptools-40.4.0-py2.py3-none-any.whl (568 kB)
  Downloading setuptools-40.3.0-py2.py3-none-any.whl (568 kB)

新しいpip resolverを正しく使用しているかどうか、特に、以下の点で、かなり混乱しています。

- Substantial improvements in new resolver for performance, output and error messages, avoiding infinite loops, and support for constraints files.

見られる動作は次のように記述されています。 バックトラック と記述されています。なぜそうなるのかは理解しています。 それは、依存関係のバージョンを修正する制約ファイル (requirements.txt のようなもの) を使用して実行時間を短縮することを指定するものです。 pip install -c constraints.txt setup.py .

この制約ファイルを作成する最良の方法は何でしょうか。現在、私が思いつく最良の方法は pip install setup.py を新しい仮想環境でローカルに実行し、次に pip freeze > constraints.txt . しかし、これでもローカルインストールにはかなりの時間がかかります(現在10分ほど止まっています)。 ノートには、次のように記載されています。 This means the “work” is done once during development process, and so will save users this work during deployment.

古い依存関係解決ツールで、私はこのパッケージをローカルに 1 分もかからずにインストールすることができました。

ここで推奨されるプロセスは何ですか?

編集: いくつかの依存関係が内部の gitlab サーバーを直接指していることがわかりました。代わりに、内部のパッケージ レジストリから直接インストールすると、数分でまた動作します。

どのように解決するのですか?

最新の更新情報 (2022-02)

でのメジャーアップデートがあるようです。 pip は数日前にメジャーアップデートされたようです (バージョン 22.0 , リリースノート + github の関連イシュー ).

まだ詳しくテストしていませんが、複雑なケースでのインストール順序の計算を最適化し、私たちが以前に遭遇した多くの問題を解決しているように見えます。しかし、それを確認するにはもっと時間が必要です。

とにかく、この回答の残りの部分はまだ有効であり、特定のプロジェクトに適したスマートな要件の固定は良い実践だと思います。


私も同じような問題に遭遇したので、これは非常に迷惑なことだと思います。バックトラックは便利な機能かもしれませんが、成功するかどうかわからないのに何時間も待たされるのは困ります。

私は、役立つかもしれないいくつかのオプションを見つけました。

  • 古いリゾルバを使用する ( --use-deprecated=legacy-resolver ) の回答で提案された @Daniel Davee によって提案されましたが、これは適切な解決策というよりも一時的な解決策に近いものです。
  • で依存関係を解決するのをスキップする。 --no-deps オプションを使用します。これは一般的にはお勧めしませんが、いくつかのケースでは、いくつかの競合があるにもかかわらず、パッケージのバージョンのセットを動作させることができます。
  • pip がバックトラックを試みるバージョンの数を減らし、パッケージの依存関係をより厳密にします。これは、例えば numpy と記述する代わりに numpy >= 1.18.0 にしてみたり、もっと厳密に numpy == 1.18.0 . この厳密さはかなり助けになるかもしれません。

以下のソースを確認してください。

私はまだ、常に役立つ適切な答えを持っていませんが、requirements.txt のベスト プラクティスは、パッケージ バージョンを "pin" することのようです。私は pip-tools を見つけましたが、これはconstrains.txtでもこれを管理するのに役立ちます(ただし、私は実験段階にあるので、これ以上話すことはできません)。

更新情報 (2021-04)

質問の著者は問題(gitlabのカスタムサーバーの何か)を解決できたようですが、他の人にも役立つかもしれないので、この回答を拡張したいと思います。

読んで試した後、私はすべてのパッケージのバージョンを特定のものに固定することに行き着きました。これは本当に正しい方法です。ピン留めしなくてもすべてが機能しますが、依存関係をピン留めしない場合、パッケージ マネージャーは、バグや非互換性のある新しいバージョンを (リリースされると) 無言でインストールします (これは、私が dask は今年最後です。)

あなたを助けるかもしれないいくつかのツールがありますが、私はこれらのアプローチのうちの1つをお勧めします。

最も簡単な方法は pipreqs

  • パイプライン は、任意のプロジェクトのインポートに基づいて、pip requirements.txtファイルを生成するライブラリです。
  • で始めることができます。 pip install pipreqs を実行し pipreqs をプロジェクトルートで実行する(あるいは最終的に --force
  • requirements.txt
  • requirements.txt
pip-tools