環境
これもdocker run python:3
を使用して再現されました。
説明
制約ファイルで互換性のないバージョンが指定されている場合、pipは依存関係が壊れたパッケージをインストールします。 エラーメッセージが表示されますが、終了コードは0
です。
たとえば、 environs 5.2.1
はmarshmallow>=2.7.0
environs 5.2.1
が必要ですが、後者が制約ファイルで指定されている場合、pipはmarshmallow 2.6.0
インストールします。
予想される行動
pipはパッケージをインストールせず、失敗して終了する必要があります。
再現する方法
marshmallow==2.6.0
constraints.txtを作成しますenvirons==5.2.1
requirements.txtを作成しますpip install -r requirements.txt -c constraints.txt
実行します出力
$ docker run --rm -ti python:3 sh
# python -V
Python 3.7.4
# pip -V
pip 19.2.3 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
# uname -a
Linux 4d4f16cc965f 4.9.184-linuxkit #1 SMP Tue Jul 2 22:58:16 UTC 2019 x86_64 GNU/Linux
# echo marshmallow==2.6.0 > constraints.txt
# echo environs==5.2.1 > requirements.txt
# pip install -r requirements.txt -c constraints.txt
Collecting environs==5.2.1 (from -r requirements.txt (line 1))
Downloading https://files.pythonhosted.org/packages/5f/c9/6b576b8b374dfe78d9435988e6a53497822f31b9da5bdd446343ad1a4d1b/environs-5.2.1-py2.py3-none-any.whl
Collecting marshmallow==2.6.0 (from -c constraints.txt (line 1))
Downloading https://files.pythonhosted.org/packages/33/44/c3bdd4222909b6452ebe5c028ea5dbe7e9409307b3b933026218c677fcf1/marshmallow-2.6.0-py2.py3-none-any.whl (44kB)
|████████████████████████████████| 51kB 729kB/s
Collecting python-dotenv (from environs==5.2.1->-r requirements.txt (line 1))
Downloading https://files.pythonhosted.org/packages/57/c8/5b14d5cffe7bb06bedf9d66c4562bf90330d3d35e7f0266928c370d9dd6d/python_dotenv-0.10.3-py2.py3-none-any.whl
ERROR: environs 5.2.1 has requirement marshmallow>=2.7.0, but you'll have marshmallow 2.6.0 which is incompatible.
Installing collected packages: marshmallow, python-dotenv, environs
Successfully installed environs-5.2.1 marshmallow-2.6.0 python-dotenv-0.10.3
# echo $?
0
これは基本的に#988と同じです(#5137も参照)。
Pipは、最初に遭遇した要件を把握します(ただし、これは予告なしに変更される場合があります)。 要件ファイルと制約ファイルを解析すると、要件としてenvirons==5.2.1
、制約としてmarshmallow==2.6.0
になります。 environs
が処理されているとき、 marshmallow
が依存関係として認識され、既存のエントリ( marshmallow==2.6.0
)が要件としてマークされ、既存のバージョンがインストールに使用されます。 。 ユーザーが指定した値を使用することは(制約としてだけでも)、おそらくここで実行できる最も正しい動作だと思います。
トレースされるエラーは、プレーンなpip install environs==5.2.1 marshmallow==2.6.0
またはpip install environs==5.2.1 && pip install marshmallow==2.6.0
ような個別の呼び出しでトレースされるエラーと同じです。
これは#5000で追加されました。 終了コードが1でない理由は、下位互換性です。
これが発生していることをプログラムで知りたい場合は、 pip check
を実行します。
この問題は、元の作成者からの詳細情報の要求に対する応答がなかったため、自動的にクローズされました。 現在問題になっている情報だけでは、行動を起こすのに十分な情報がありません。 さらに調査できるように、必要な回答がある場合はご連絡ください。