Как лучше всего распространять пакет Python, для которого требуется минимальная версия Python

У меня есть проект Python 2 («foo 0.1.7»), для которого требуется Python 2.4 или более поздней версии.

Теперь я перенес его на Python 3 («foo 0.2.0») таким образом, что он по-прежнему совместим с Python 2, но теперь требования подняты до Python 2.6 или более поздней версии.

  • Я знаю, что для setup.py есть опция --target-version=2.6, которую можно использовать с upload, но, похоже, это не означает «2.6 или выше».
  • Команда setup имеет параметр install_requires, но он предназначен для обязательных пакетов, а не для интерпретатора Python.

Я мог бы сделать что-то подобное в setup.py из «foo 0.2.0»:

if sys.hexversion < 0x02060000:
    raise RuntimeError('This package requires Python 2.6 or later, try foo 0.1.7')

но я бы предпочел, чтобы easy_install foo каким-то образом решил эту проблему.

Итак, как мне развернуть это на PyPI?


person mar10    schedule 03.10.2011    source источник


Ответы (2)


Похоже, вы ищете способ загрузить версии 0.1.7 и 0.2.0 вашей программы, чтобы easy_install-2.5 автоматически использовала 0.1.7, а easy_install-2.6 — 0.2.0.

Если это так, я не уверен, что это возможно сделать с текущей системой... проверка raise RuntimeError() может быть лучшим вариантом, доступным в настоящее время; людям, которые установят ваш проект, придется вручную easy_install-2.5 -U "proj<0.2" или что-то подобное.

Тем не менее, в настоящее время существует специальная группа, работающая над заменой distutils, setuptools и т. д. обновленной библиотекой с именем packaging. Эта новая библиотека сочетает в себе функции существующих библиотек расширения distutils, а также множество других улучшений. Его планируется включить в Python 3.3, а затем портировать как distutils2.

Особое значение для вашего вопроса имеет то, что он содержит множество улучшений метаданных установки; включая параметр "requires_python", указать именно ту информацию, которую вы хотите. Однако я не уверен, как они планируют использовать эту информацию, и приведет ли это к тому, что новая система установки будет вести себя так, как вы хотели.

Я бы рекомендовал разместить сообщение на сообщество упаковки, группа Google, посвященная разработке новой системы, они могли бы предоставить подробную информацию о том, как должна работать requires_python... и, возможно, получить желаемое поведение при установке на первом этаже новой системы, если это кажется осуществимым (и еще не существует).

person Eli Collins    schedule 03.10.2011

Я знаю, что для setup.py есть параметр --target-version=2.6, который можно использовать с загрузкой, но, похоже, это не означает «2.6 или выше».

На самом деле это вариант для bdist_wininst или bdist_msi, и он действительно не включает «или выше».

В команде установки есть опция install_requires, но она предназначена для обязательных пакетов, а не для интерпретатора Python.

Возможно, сработает установка «Python >= 2.6» в install_requires: Python 2.5 до 3.2 создает файл Python-blahblah-pyXY.egg-info, поэтому, если вам повезет, easy_install может обнаружить, что требование выполнено. Если нет, он, вероятно, попытается загрузить из PyPI, так что ...

Я мог бы сделать что-то подобное в setup.py для «foo 0.2.0»:

На самом деле это текущая распространенная идиома. Кроме того, использование классификаторов «Язык программирования :: Python :: X.Y» даст информацию для людей (я не знаю ни одного инструмента, использующего эту информацию).

В ближайшем будущем есть надежда. Спецификация метаданных дистрибутивов Python была обновлена, и последняя версия содержит поле для требования конкретной версии Python: http://www.python.org/dev/peps/pep-0345/#requires-python

Что касается поддержки инструментов: distutils заморожен и не будет его поддерживать, setuptools может добавить или не добавить поддержку, его форк-дистрибутив, вероятно, получит поддержку, а distutils2/packaging уже поддерживает его. distutils2 включает базовый установщик под названием pysetup, который должен учитывать поле Requires-Python (если нет, сообщите об этом на bugs.python.org).

Теперь, чтобы решить вашу проблему прямо сейчас, вы можете сделать одну из следующих вещей: - заявить, что ваш проект поддерживает только 2.6+ - указать, что пользователям 2.4 необходимо закрепить версию при загрузке (например, pip install "foo==0.1.7" )

person Éric Araujo    schedule 09.10.2011