Запретить установку пакета на старых версиях 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 для совместимых версий и в противном случае создать исключение.

  • Не удается установить подушку на centos
  • Как создать яйца Python из исходных пакетов distutils?
  • ссылки на установку ссылок
  • как заставить pip уважать переменную окружения «CC»
  • Принудительное затмение для перезагрузки модулей Python
  • Setuptools не могут использовать ссылку из dependency_links
  • Как установить Bootstrap numpy в setup.py
  • Ресурсы упаковки с помощью setuptools / распространения
  • Нет модуля с именем pkg_resources
  • PIP устанавливает пакет Python без файла setup.py?
  • Доступ к собственным метаданным яйца питона
  • Python - лучший язык программирования в мире.