Нужно ли включать setuptools в setup_requires в Python? - PullRequest
3 голосов
/ 23 октября 2019

Обратный порт importlib_resources для Python <3.7 из стандартного библиотечного модуля <a href="https://docs.python.org/3/library/importlib.html?highlight=importlib#module-importlib.resources" rel="nofollow noreferrer">importlib.resources содержит следующий раздел в файле setup.cfg:

[options]
python_requires = >=2.7,!=3.0,!=3.1,!=3.2,!=3.3
setup_requires =
    setuptools
    wheel
install_requires =
    pathlib2; python_version < '3'
    typing; python_version < '3.5'
packages = find:

Почему setup_requires включает setuptools? Это, кажется, не имеет смысла, поскольку:

  • первая строка файла setup.py импортирует setuptools, поэтому к тому времени, когда функция setup вызывается и считывает настройкиФайл .cfg, который дает указание установить setuptools, уже слишком поздно для установки setuptools:

    from setuptools import setup
    setup()
    
  • setuptools уже установлен на любой новой установке Python (ну,протестировано только на Windows 10 и MacOS 10.15 с Python 3.8.0):

    $ python -V
    Python 3.8.0
    $ pip list
    Package    Version
    ---------- -------
    pip        19.2.3
    setuptools 41.2.0
    WARNING: You are using pip version 19.2.3, however version 19.3.1 is available.
    You should consider upgrading via the 'python -m pip install --upgrade pip' command.
    

Ответы [ 2 ]

2 голосов
/ 23 октября 2019

Нет, setuptools не следует включать в setup_requires, в соответствии с PEP 518 (выделение жирным шрифтом):

Установочные инструменты пытались решить эту проблему с помощью setup_requires аргумент для его setup() функции [3]. Это решение имеет ряд проблем, таких как:

  • Ни один инструмент (кроме самого setuptools) не может получить доступ к этой информации без выполнения setup.py, но setup.py не может быть выполнен без этихэлементы установлены.
  • Хотя сама программа setuptools сама установит что-либо из этого, они не будут установлены до во время выполнения функции setup(), что означает, что единственный способиспользуйте все, что добавлено здесь, через все более сложные махинации, которые задерживают импорт и использование этих модулей на более поздний срок при выполнении функции setup().
  • Это не может включать в себя setuptools и не можетвключает замену на setuptools, что означает, что такие проекты, как numpy.distutils, по большей части не могут использовать его, и проекты не могут использовать преимущества новых функций setuptools, пока их пользователи не обновят версию setuptools естественным образом до более новой.
  • Элементы, перечисленные в setup_requires, устанавливаются неявно, когдавы выполняете setup.py, но один из распространенных способов выполнения setup.py - это другой инструмент, такой как pip, который уже управляет зависимостями. Это означает, что такая команда, как pip install spam, может в конечном итоге загружать и устанавливать пакеты как pip, так и setuptools, а конечным пользователям необходимо настроить оба инструмента (и для setuptools без контроля вызова) наизменить настройки, например, из какого хранилища он устанавливает. Это также означает, что пользователям необходимо знать правила обнаружения для обоих инструментов, поскольку один из них может поддерживать разные форматы пакетов или по-разному определять последнюю версию.
2 голосов
/ 23 октября 2019

Почему в setup_requires включены setuptools? Кажется, это не имеет смысла

Не имеет смысла вообще. С другой стороны, это ничего не мешает, так почему бы и нет?

...