Python имеет запутанную историю инструментов , которые могут быть использованы для упаковки и описания проектов: они включают distutils
в стандартной библиотеке, distribute
, distutils2
и setuptools
(а могут и больше). Похоже, что distribute
и distutils2
были прекращены в пользу setuptools
, что оставляет два конкурирующих стандарта.
Насколько я понимаю, setuptools
предлагает гораздо больше возможностей (например, объявление зависимостей, тестов и т. Д.), Чем distutils
, однако, он не включен в стандартную библиотеку Python (пока?).
Руководство пользователя Python Packaging [ 1 ] рекомендует сейчас:
Используется
setuptools
для определения проектов и создания исходных дистрибутивов.
И объясняет:
Хотя вы можете использовать pure
distutils
для многих проектов, он не поддерживает определение зависимостей от других проектов и не имеет нескольких вспомогательных утилит для правильного автоматического заполнения метаданных пакета, которые предоставляютсяsetuptools
. Находясь за пределами стандартной библиотеки, setuptools также предлагает более согласованный набор функций для разных версий Python и (в отличие отdistutils
)setuptools
будет обновлен для создания следующих стандартных форматов «Метаданные 2.0» для всех поддерживаемых версий.Даже для проектов, которые решили использовать
distutils
, когда pip устанавливает такие проекты непосредственно из источника (а не из предварительно созданного файла wheel), он фактически построит ваш проект, используяsetuptools
вместо этого.
Однако просмотр файлов setup.py различных проектов показывает, что это не совсем настоящий стандарт. Многие пакеты все еще используют distutils
и те , что поддержка setuptools
часто смешивают setuptools
с , distutils
например, делая импорт резервный:
try:
from setuptools import setup
except ImportError:
from distutils.core import setup
Затем последовала попытка найти способ написать установку, которая могла бы быть установлена как с помощью, так setuptools
и с помощью distutils
. Это часто включает различные способы проверки зависимостей, подверженных ошибкам, поскольку distutils
не поддерживает зависимости в функции настройки.
Почему люди все еще прилагают дополнительные усилия для поддержки distutils
- это setuptools
единственная причина , которой нет в стандартной библиотеке? Каковы преимущества distutils
и есть ли недостатки написания файлов setup.py, которые только поддерживают setuptools
.
distutils
был снова объединенsetuptools
, но есть устаревшие приложения, которые были написаны для использования,distutils
и переход на правильные стандарты требует затрат.setuptools
является улучшенной альтернативой,distutils
но обратите внимание, что « Рекомендуемый установщик pip запускает все сценарии setup.pysetuptools
, даже если сам сценарий только импортируетdistutils
» ( источник )Ответы:
Взгляните на этот ТАК вопрос. Он очень хорошо объясняет все методы упаковки и может в некоторой степени помочь ответить на ваш вопрос: Различия между distribute, distutils, setuptools и distutils2?
Итак, как вы видите, setuptools следует предпочесть distutils, и я понимаю, откуда взялся ваш вопрос, однако я не вижу, чтобы distutils терял поддержку в ближайшее время, поскольку, проще говоря, он используется во многих случаях с некоторыми популярными устаревшими программами. . И, как вы, вероятно, знаете, изменение такого рода вещей в устаревших программах может быть довольно болезненным и иметь довольно много проблем, например несовместимость, которые затем привели бы к тому, что разработчику пришлось бы переписывать исходный код. Так что есть это, а также тот факт, что distutils является частью стандартной библиотеки python, тогда как setuptools - нет. Итак, если вы создаете программу на Python, в наши дни используйте setuptools, однако имейте в виду, что без distutils, setuptools никогда бы не существовали.
источник
Это одна из причин. Следующее прямо из NumPy
setup.py
:if len(sys.argv) >= 2 and ('--help' in sys.argv[1:] or sys.argv[1] in ('--help-commands', 'egg_info', '--version', 'clean')): # Use setuptools for these commands (they don't work well or at all # with distutils). For normal builds use distutils. try: from setuptools import setup except ImportError: from distutils.core import setup
Так что NumPy предпочитает,
setuptools
если сможет его найти. Но затем SciPy делал это, пока не был исправлен, чтобы предпочестьdistutils
некоторые ситуации. Ссылаясь на журнал фиксации:Setuptools sets mode +x on the test scripts, so that Nose refuses to run them. Better not do that.
Конечно, слияние между
setuptools
иdistribute
должно решить все это в свое время, но многие пакеты еще нужно поддерживать Python 2.6 установки.источник
distribute
была вилкаsetuptools
и теперь слита обратно.Есть несколько причин, по которым мы все еще говорим и используем distutils, хотя setuptools, без сомнения, лучший набор инструментов.
Во-первых, повсюду доступен distutils. Если вы хотите создать модуль для обмена с другими и у вас нет сложных требований, он гарантированно будет доступен на вашем рабочем компьютере. Это особенно важно, если вам нужно поддерживать старые версии python или если вы работаете в незнакомой среде.
Во-вторых, setuptools предоставляет расширения для distutils. Поэтому он смоделирован на основе набора инструментов distutils и берет оттуда всю его структуру. Документация для setuptools предполагает, что читатель знаком с distutils, и документирует только то, как он расширяет базовый набор инструментов. Вы можете подумать, что distutils определяет диалект, а setuptools улучшает этот диалект.
Мой личный подход к новым проектам основан на предположении, что я собираюсь использовать distutils. Я делаю обновление только по мере того, как проект разрастается, и ему требуется функция setuptools. Setuptools - это прямая замена для distutils, это однострочное изменение моего setup.py.
источник
В основном это связано с разделением обязанностей.
setuptools
не является частью стандартной библиотеки Python, потому что поддерживается сторонней, а не основной командой Python. Что означает, среди прочего:Фактически, основная команда сузила объем distutils , зарезервировав «основные стандарты» и «минимально необходимую компиляцию» для себя , оставив все остальное (расширенный компилятор / формат пакета / любая поддержка) сторонним разработчикам. Код, который ранее охватывал эти «расширенные части», остался устаревшим для обратной совместимости.
Из раздела Распространение модулей Python - документация Python 2.7.12 :
Пакеты для других операционных систем также являются , вероятно, обеспечит
setuptools
иpip
отдельно - по вышеупомянутым причинамисточник