Запретить установку пакета на старых версиях Python

Что мы можем вставить в файл setup.py чтобы предотвратить сбор и попытку установки пакета при использовании неподдерживаемой версии Python?

Например, magicstack – это проект, указанный в кластере:

 Programming Language :: Python :: 3 :: Only 

Поэтому я ожидаю следующее поведение, если pip --version привязана к python 2.7:

 $ pip install magicstack Collecting magicstack Could not find a version that satisfies the requirement magicstack (from versions: ) No matching distribution found for magicstack 

Но фактическое поведение заключается в том, что pip собирает выпуск, загружает его, пытается его установить и терпит неудачу. Существуют и другие выпуски Python3, например curio , которые фактически устанавливаются нормально – поскольку setup.py не использовал ничего конкретного Python 3 – только для сбоя при импорте, когда используется только синтаксис Python 3. И я уверен, что есть пакеты, которые устанавливают ОК, импортируют ОК и, возможно, только сбой во время выполнения!

Каков правильный метод, чтобы указать поддерживаемые версии Python таким образом, чтобы pp уважать? Я нашел обходное решение, связанное с загрузкой только файла с колесом и отказом от загрузки дистрибутива .tar.gz, но мне было бы интересно узнать правильное исправление.


Изменить: Как пип не знает, чтобы загрузить распределение колес, если Python / os / architecture не соответствует? Использует ли он только соглашение .whl filename или есть что-то более сложное, чем это происходит за кулисами? Можем ли мы каким-то образом предоставить метаданные исходному дистрибутиву, чтобы заставить pip делать правильные вещи с загрузкой .tar.gz?

2 Solutions collect form web for “Запретить установку пакета на старых версиях Python”

Существует правильный способ сделать это, но, к сожалению, pip только начал поддерживать его в версии 9.0.0 (выпущен 2016-11-02), и поэтому пользователи со старыми версиями pip будут продолжать загружать пакеты волей-неволей независимо от того, что Python для них они предназначены.

В файле setup.py передайте setup() аргумент python_requires котором перечислены поддерживаемые вашим Python версии в качестве спецификатора версии PEP 440 . Например, если ваш пакет предназначен только для Python 3+, напишите:

 setup( ... python_requires='>=3', ... ) 

Если ваш пакет предназначен для Python 3.3 и выше, но вы еще не готовы к поддержке Python 4, напишите:

 setup( ... python_requires='~=3.3', ... ) 

Если ваш пакет для Python 2.6, 2.7 и всех версий Python 3, начиная с 3.3, напишите:

 setup( ... python_requires='>=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4', ... ) 

И так далее.

Как только вы это сделаете, вам нужно будет обновить версию setuptools до 24.2.0, чтобы аргумент python_requires обрабатывался; более ранние версии просто игнорируют его с предупреждением. Затем все sdists и диски вашего проекта, созданные впоследствии, будут содержать соответствующие метаданные, которые сообщают PyPI, чтобы сообщить, для каких версий Python они предназначены.

Распределение magicstack на pypi нарушено. Он не работает, потому что исходный дистрибутив не содержит пакет magicstack , хотя setup.py для дистрибутива источника говорит, что он должен.

Пока pypi содержит исходный дистрибутив (например .tar.gz , .zip ), pip будет загружать его, если он не может найти соответствующий двоичный дистрибутив (например .egg , .whl ) для вашей версии python / os / architecture ,

Ваши варианты должны только загружать бинарные дистрибутивы в pypi (желательно wheels ), хотя я даже не знаю, разрешены ли только pinary-пакеты с двоичным кодом. Другой вариант – проверить sys.version в sys.version setup.py для совместимых версий и в противном случае создать исключение.

  • Как подавить PEP440Warning от setup.py?
  • Почему файл информации о яйце, созданный, когда я использую distutils?
  • python setuptools install_requires игнорируется при переопределении cmdclass
  • Как создать яйца Python из исходных пакетов distutils?
  • Каков официальный «предпочтительный» способ установки pip и virtualenv в масштабах всей системы?
  • Как я могу настроить инструменты для установки пакета PyPI с разветвленной версией github?
  • Что означает «Не удалось найти каталог .egg-info в записи установки» из пипа?
  • Структура пакета Python, setup.py для запуска модульных тестов
  • Python - лучший язык программирования в мире.