Проблема здесь не в том, что требовалась более новая версия пакета, а в том, что требовалась несовместимая версия.
Формат спецификации версии, используемый pip, описан в PEP 440 . Этот формат полностью совместим с semanti c версиями , который по существу состоит из номеров версий в форме Major.Minor.Path
. Используя эту схему управления версиями, пакеты с различными версиями Major
могут иметь обратно несовместимые изменения API, и поэтому пакеты не могут свободно обновляться между основными версиями без кода, нарушающего риск.
Конкретным примером этого является разница между Python 2.XX и Python 3.XX. С этим изменением основного номера версии Python получил множество обратно несовместимых изменений, таких как замена print
оператор со встроенной функцией. Это привело к тому, что многие действительные Python 2 программы стали недействительными в Python 3, и поэтому разработчики могли переносить свои программы на более новую основную версию Python только после того, как они убедились, что их программы будут совместимы с новым API.
В вашем примере у вас установлена версия setuptools 39.0.1
. Затем вы попытались установить пакет, который зависит от setuptools 40.3.0
или новее. Как вы заметите, основные номера версий этих двух пакетов различаются (39 != 40
), и поэтому pip не может быть уверен, что обновление пакета не нарушит вашу существующую среду Python.
Если бы вместо этого вы установили, скажем, setuptools 40.2.0
, pip с удовольствием обновил бы вашу установку setuptools до 40.3.0
. Это связано с тем, что изменения в версии Minor
должны быть обратно совместимыми, и поэтому любой код, работающий с setuptools 40.2.0
, должен работать так же хорошо с 40.3.0
.