setup.py: ограничить допустимую версию интерпретатора Python

У меня есть библиотека Python. К сожалению, я еще не обновил его для работы с Python 3.

в его setup.py я добавил

install_requires=['python<3'],

Я намеревался не допустить, чтобы этот пакет был установлен / использован под python 3, потому что я знаю, что он (пока) не работает. Я не думаю, что это правильный способ сделать это, потому что pip Затем пытается загрузить и установить Python 2.7.3 (который уже является установленной версией!).

Как мне указать зависимость библиотеки от определенного диапазона версий интерпретатора Python? Должен ли я добавить Programming Language :: Python :: 2 :: Only тег? Это на самом деле помешает установке под python 3? Что, если я также хочу ограничить минимальную версию Python 2.6?

Я бы предпочел решение, которое работает везде, но согласилось бы на решение, которое работает только в pip (и мы надеемся, что easy_install не захлебнется).

2 ответа

Решение

Начиная с версии 9.0.1 пип будет соблюдать новый python_requires строка, указывающая версию Python, необходимую для установки, например:

setup(
    ...,
    python_requires=">=3.3"
)

Смотрите здесь для более подробной информации. Смотрите также этот ответ на SO.

Одним из возможных решений является тестирование версии Python, поскольку pip не может удовлетворить версию Python, за исключением версии, в которой он в данный момент работает (он устанавливается в текущей среде Python):

import sys
if not sys.version_info[0] == 2:
    sys.exit("Sorry, Python 3 is not supported (yet)")

setup(...

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

Для простоты и полноты иллюстрации я составил очень минимальный и простой проект Python 3. Единственный сторонний пакет, который он использует, - это знаменитый клиентский пакет SSH. paramiko(официальную страницу PyPi можно найти здесь).

Интерпретатор Python в виртуальной среде моего проекта имеет версию 3.6.9.

Теперь, чтобы проверить python_requires атрибут "в действии", я добавил его в проект setup.py скрипт, который выглядит следующим образом:

from setuptools import setup, find_packages

setup(name='mySampleProject',
      version='1.0',
      description='Sample project in Python 3',
      author='Guy Avraham',
      license='MIT',
      packages=find_packages(),
      include_package_data=True,
      python_requires='>=3.8',
      install_requires=['paramiko'])

Обратите внимание, что я "требовал", чтобы версия Python была 3.8+. Это, конечно, НЕ должно работать с текущей версией Python в виртуальной среде проекта, которая является 3.6.9.

Теперь, когда я создаю проект, используя "нормальное" использование в setup.py, то есть запустив: python3 setup.py install, проект построен успешно. См. Следующий вывод pip3 list команда после запуска python3 setup.py install команда:

(mySampleProject_env) guya@ubuntu:~/mySampleProject$ pip3 list
DEPRECATION: The default format will switch to columns in the future. You can use -- 
format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
bcrypt (3.2.0)
cffi (1.14.3)
cryptography (3.1.1)
mySampleProject (1.0)
paramiko (2.7.2)
pip (9.0.1)
pkg-resources (0.0.0)
pycparser (2.20)
PyNaCl (1.4.0)
setuptools (39.0.1)
six (1.15.0)

Как видите, проект вместе со всеми его "зависимостями" был установлен ДАЖЕ, хотя я НЕ ожидал этого.

С другой стороны, когда я установил проект с помощью команды: pip3 install -e . (Обратите внимание . чтобы указать "текущий рабочий каталог"), я получил следующий вывод:

(mySampleProject_env) guya@ubuntu:~/mySampleProject$ pip3 install -e .
Obtaining file:///home/guya/mySampleProject
mySampleProject requires Python '>=3.8' but the running Python is 3.6.9

Которая теперь действительно "считает" python_requires атрибут, таким образом "проваливая" сборку проекта.

Это подробно описано в самом первом абзаце урока на этой странице, а также в течение минут ~09:00 - 11:00 в этом видео.

ПРИМЕЧАНИЕ. Я НЕ проверял все вышеперечисленное для Python 2 (или pip для Python 2).

Другие вопросы по тегам