setup.py: требуется последняя версия setuptools, прежде чем пытаться установить

Я создаю пакет, который имеет 'typing;python_version<"3.5"' в это install_requires, По-видимому, этот тип спецификации зависимостей был реализован только в последних версиях setuptools, Если setuptools на старой машине пользователя они получат:

'install_requires' должен быть строкой или списком строк, содержащих допустимые спецификаторы требований проекта / версии; Ожидаемая версия спецификации при наборе; python_version<"3.5" в; python_version <"3.5"

Простое решение состоит в том, чтобы сказать пользователям pip install 'setuptools>=36.2.1' до pip install my-package, (Обратите внимание, что 36.2.1 это просто версия, которая, как я знаю, работает, не обязательно абсолютное минимальное требование)

Но есть ли способ указать это требование в setup.py так что это будет сделано автоматически? Добавление setuptools>=36.2.1 в install_requires а также setup_requires не работал. Это говорит Installed /tmp/pip-si2fqg-build/.eggs/setuptools-38.2.5-py3.3.egg а затем выдает ту же ошибку выше.

2 ответа

Решение

Вы не можете обновить setuptools и использовать его код в скрипте установки за один проход. Я вижу два возможных решения: если вы хотите поддерживать старые версии setuptools, вы не можете использовать маркеры env. Реализуйте проверку самостоятельно, используя sys.version_info:

import sys
from setuptools import setup


setup(
    name='spam',
    version='0.1',
    packages=[],
    install_requires=['typing'] if sys.version_info < (3, 5) else []
)

Если вы не хотите поддерживать старые версии setuptools, проверьте его версию и прервите работу заранее, сообщив пользователю:

import sys
from distutils.version import StrictVersion
from setuptools import setup, __version__


if StrictVersion(__version__) < StrictVersion('20.2'):
    print('your setuptools version does not support PEP 508. Upgrade setuptools and repeat the installation.')
    sys.exit(1)


setup(
    name='spam',
    version='0.1',
    packages=[],
    install_requires=['typing;python_version<"3.5"']
)

Я только что узнал о PEP 518 - Указание минимальных системных требований сборки для проектов Python, которые решают именно эту проблему.

Короче говоря, этот принятый PEP предлагает хранить зависимости в формате TOML в файле с именем pyproject.toml, Для большинства проектов Python содержимое этого файла будет:

[build-system]
# Minimum requirements for the build system to execute.
requires = ["setuptools", "wheel"]  # PEP 508 specifications.

В случае этого конкретного вопроса нам просто нужно заменить "setuptools" с "setuptools>=36.2.1",

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

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