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.