Почему pip устанавливает несовместимую версию пакета? - PullRequest
5 голосов
/ 19 февраля 2020

Я использую pip 20.0.2 в Ubuntu и устанавливаю кучу требований из файла требований. По какой-то причине pip решает установить idna==2.9 (ссылка) , хотя это не совместимая версия с одной из моих непосредственно перечисленных зависимостей. Поэтому я использовал python -m pipdeptree -r в virtualenv, в который я все устанавливаю, и вижу это в списке для idna:

idna==2.9                                         
  - cryptography==2.3.1 [requires: idna>=2.1]
  - requests==2.22.0 [requires: idna>=2.5,<2.9]
    - requests-oauthlib==1.3.0 [requires: requests>=2.0.0]
      - social-auth-core==3.2.0 [requires: requests-oauthlib>=0.6.1]
        - social-auth-app-django==2.1.0 [requires: social-auth-core>=1.2.0]
    - responses==0.10.9 [requires: requests>=2.0]
    - social-auth-core==3.2.0 [requires: requests>=2.9.1]                           
      - social-auth-app-django==2.1.0 [requires: social-auth-core>=1.2.0]

Как мы видим, мои две прямые зависимости (cryptography и requests), это то, что требует idna. В соответствии с этим, похоже, что pip должен решить установить 2.8, потому что это последняя версия, которая будет соответствовать ограничениям.

Почему pip вместо этого устанавливает idna 2.9, как указано в верхней строке этого вывода, и это сообщение об ошибке при запуске pip install -r requirements.txt:

ERROR: requests 2.22.0 has requirement idna<2.9,>=2.5, but you'll have idna 2.9 which is incompatible.

РЕДАКТИРОВАТЬ: содержимое файла require.txt и его дочерних элементов, как указано в комментариях:

# requirements.txt
-r requirements/requirements-base.txt
-r requirements/requirements-testing.txt

# requirements-base.txt
cryptography~=2.3.1
pyjwt~=1.6.4
requests~=2.22.0
social-auth-app-django~=2.1.0

# requirements-testing.txt
hypothesis~=3.87.0
pytest~=3.6.2
pytest-django~=3.3.2
pytest-cov~=2.5.1
responses~=0.10.5

Редактировать 2: я создал минимально жизнеспособный пример. Для этого примера, вот вам файл require.txt:

cryptography~=2.3.1
requests~=2.22.0

А вот команды, которые я запускал от начала до конца sh в каталоге fre sh:

virtualenv -p python3.6 -v venv
source venv/bin/activate
pip install -r requirements.txt --no-cache-dir

И полный вывод:

Collecting cryptography~=2.3.1
  Downloading cryptography-2.3.1-cp34-abi3-manylinux1_x86_64.whl (2.1 MB)
     |████████████████████████████████| 2.1 MB 2.0 MB/s 
Collecting requests~=2.22.0
  Downloading requests-2.22.0-py2.py3-none-any.whl (57 kB)
     |████████████████████████████████| 57 kB 18.5 MB/s 
Collecting asn1crypto>=0.21.0
  Downloading asn1crypto-1.3.0-py2.py3-none-any.whl (103 kB)
     |████████████████████████████████| 103 kB 65.4 MB/s 
Collecting idna>=2.1
  Downloading idna-2.9-py2.py3-none-any.whl (58 kB)
     |████████████████████████████████| 58 kB 71.4 MB/s 
Collecting six>=1.4.1
  Downloading six-1.14.0-py2.py3-none-any.whl (10 kB)
Collecting cffi!=1.11.3,>=1.7
  Downloading cffi-1.14.0-cp36-cp36m-manylinux1_x86_64.whl (399 kB)
     |████████████████████████████████| 399 kB 30.3 MB/s 
Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1
  Downloading urllib3-1.25.8-py2.py3-none-any.whl (125 kB)
     |████████████████████████████████| 125 kB 46.7 MB/s 
Collecting certifi>=2017.4.17
  Downloading certifi-2019.11.28-py2.py3-none-any.whl (156 kB)
     |████████████████████████████████| 156 kB 65.1 MB/s 
Collecting chardet<3.1.0,>=3.0.2
  Downloading chardet-3.0.4-py2.py3-none-any.whl (133 kB)
     |████████████████████████████████| 133 kB 60.8 MB/s 
Collecting pycparser
  Downloading pycparser-2.19.tar.gz (158 kB)
     |████████████████████████████████| 158 kB 25.0 MB/s 
Building wheels for collected packages: pycparser
  Building wheel for pycparser (setup.py) ... done
  Created wheel for pycparser: filename=pycparser-2.19-py2.py3-none-any.whl size=111031 sha256=030a1449dd5902f2f03e9e2f8f9cc6760503136a9243e965237a1ece1196502a
  Stored in directory: /tmp/pip-ephem-wheel-cache-c_dx8qi5/wheels/c6/6b/83/2608afaa57ecfb0a66ac89191a8d9bad71c62ca55ee499c2d0
Successfully built pycparser
ERROR: requests 2.22.0 has requirement idna<2.9,>=2.5, but you'll have idna 2.9 which is incompatible.
Installing collected packages: asn1crypto, idna, six, pycparser, cffi, cryptography, urllib3, certifi, chardet, requests
Successfully installed asn1crypto-1.3.0 certifi-2019.11.28 cffi-1.14.0 chardet-3.0.4 cryptography-2.3.1 idna-2.9 pycparser-2.19 requests-2.22.0 six-1.14.0 urllib3-1.25.8

1 Ответ

1 голос
/ 19 февраля 2020

Пип не имеет решателя зависимостей. Если вы скажете ему установить пакет foo без каких-либо оговорок, вы получите самую новую версию foo, даже если она конфликтует с другими пакетами, которые вы уже установили.

Другие решения, такие как поэзия существует, которая делает имеет логику c, чтобы все было совместимо. Если вам это нужно, рассмотрите возможность использования чего-то подобного вместо простого пункта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...