Подтвердить что ты не робот

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

У меня есть проект 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.not.

Я мог бы сделать что-то подобное в 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?

4b9b3361

Ответ 1

Похоже, что вы ищете способ загрузить как версию 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 должен работать... и, возможно, получить поведение установки, которое вы хотите, на первом этаже новой системы, если это кажется выполнимым (и еще не существует).

Ответ 2

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

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

Команда установки имеет параметр install_requires, но это необходимо пакеты,.not интерпретатор 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': если sys.hexversion < 0x02060000:    raise RuntimeError ('Этот пакет требует Python 2.6 или новее, попробуйте foo 0.1.7')

На самом деле это обычная идиома. Кроме того, использование классов "Programming Language:: Python:: X.Y" даст информацию для людей (Im не знает о каком-либо инструменте, использующем эту информацию).

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

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

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