Каков наилучший способ распространения пакета Python, который требует минимальной версии Python - PullRequest
11 голосов
/ 03 октября 2011

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

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

  • Я знаю, что есть параметр --target-version=2.6 для setup.py, который можно использовать с 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?

Ответы [ 2 ]

4 голосов
/ 09 октября 2011

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

На самом деле это опция для bdist_wininst или bdist_msi, и на самом деле она не содержит «или выше».

Команда setup имеет опцию 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': if sys.hexversion <0x02060000:поднять RuntimeError («Для этого пакета требуется Python 2.6 или более поздней версии, попробуйте foo 0.1.7») </p>

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

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

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

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

2 голосов
/ 03 октября 2011

Звучит так, будто вы ищете способ загрузить версию 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.

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

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

...