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).