Pipの新機能

2020-10-07

TL;DR

Python標準パッケージインストーラ pip のバージョン20.3で、大きな機能追加 が行われます。これにより、既存のプロジェクトでもエラーが発生する可能性があるので、できれば事前に試しておきましょう。

Pythonパッケージの依存関係

pipコマンドでパッケージをインストールすると、そのパッケージが利用している、別のパッケージも自動的にインストールされます。たとえば、 A というパッケージをインストールするとき、AB というパッケージを利用している場合は、自動的に B もインストールされます。

パッケージの依存関係では、依存するパッケージのバージョンも指定できます。例えば、

  • パッケージ A のバージョン 1.0 はパッケージ B の バージョン 1.0 を利用する
  • パッケージ A のバージョン 2.0 はパッケージ B の バージョン 2.0 を利用する

のように設定できます。

image.png

このように設定しておけば、パッケージ A のバージョン 1.0 をインストールすると、自動的にパッケージ B のバージョン 1.0 をインストールしてくれます。また、パッケージ A のバージョン 2.0 をインストールすると、自動的にパッケージ B のバージョン 2.0 をインストールしてくれます

さて、ここにパッケージ A と、パッケージ B のバージョン 1.0に依存しているもう一つのパッケージ C があります。

パッケージ A のバージョン 2.0 がインストールされている状態で、パッケージ C をインストールするとどうなるでしょう?

image.png

パッケージ A のバージョン 2.0 はパッケージ B のバージョン 2.0を必要としていますが、パッケージ C はパッケージ B のバージョン 1.0 を指定しています。

あちらを立てればこちらが立たない状態ですが、これまでのpipコマンドは、パッケージ C で指定したパッケージ B のバージョン 1.0 をインストールしてしまいます。このため、パッケージ C のインストール後は、パッケージ A は動かなくなってしまいます。

これまで、こういった事態を避けるため、依存関係の解決は pip にまかせずに、インストールするバージョンを手動で明示的に指定したり、pipenvpoetry などの依存関係を解決するツールを利用する必要がありました。

新しい依存リゾルバ

現在、この問題を解決するためにpipの 改善 が進められています。近々リリースされる予定のバージョン20.3では、前述のパッケージ C をインストールすると

  1. パッケージ A のバージョン 2.0 とパッケージ Bのバージョン 2.0 をアンインストール
  2. 改めてパッケージ A のバージョン 1.0 とパッケージBのバージョン 1.0 をインストール

としてバージョンの不整合を解決します。

現在リリース済みの pip 20.2でも、 --use-feature=2020-resolver というオプションを指定すると、新しい依存関係の解決を試せます。20.3 がリリースされると、これまでより依存関係のチェックが厳格になり、本番環境などでエラーが発生する可能性もあります。できるだけ、現在進行中のプロジェクトでも事前に試しておきましょう。


Copyright © 2001-2021 python.jp Privacy Policy python_japan
Amazon.co.jpアソシエイト
Amazonで他のPython書籍を検索