setuptools против distutils: почему distutils все еще актуален?

147

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.

чел
источник
4
distutilsбыл снова объединенsetuptools , но есть устаревшие приложения, которые были написаны для использования, distutilsи переход на правильные стандарты требует затрат.
metatoaster
3
«Похоже, что distribute и distutils2 были прекращены в пользу setuptools», правильно, distribute - это только оболочка для setuptools, а distutils2 мертв.
kay
1
setuptoolsявляется улучшенной альтернативой, distutilsно обратите внимание, что « Рекомендуемый установщик pip запускает все сценарии setup.py setuptools, даже если сам сценарий только импортируетdistutils » ( источник )
user2314737

Ответы:

80

Взгляните на этот ТАК вопрос. Он очень хорошо объясняет все методы упаковки и может в некоторой степени помочь ответить на ваш вопрос: Различия между distribute, distutils, setuptools и distutils2?

Distutils по-прежнему является стандартным инструментом для упаковки в Python. Он включен в стандартную библиотеку (Python 2 и Python 3.0–3.3). Это полезно для простых дистрибутивов Python, но в нем отсутствуют функции. Он представляет пакет Python distutils, который можно импортировать в ваш сценарий setup.py.

Setuptools был разработан для преодоления ограничений Distutils и не включен в стандартную библиотеку. Он представил утилиту командной строки под названием easy_install. Он также представил пакет Python setuptools, который можно импортировать в ваш сценарий setup.py, и пакет Python pkg_resources, который можно импортировать в код для поиска файлов данных, установленных вместе с дистрибутивом. Одна из его ловушек заключается в том, что он «обезьяны» исправляет пакет Python distutils. Он должен хорошо работать с pip. Последняя версия была выпущена в июле 2013 года.

Итак, как вы видите, setuptools следует предпочесть distutils, и я понимаю, откуда взялся ваш вопрос, однако я не вижу, чтобы distutils терял поддержку в ближайшее время, поскольку, проще говоря, он используется во многих случаях с некоторыми популярными устаревшими программами. . И, как вы, вероятно, знаете, изменение такого рода вещей в устаревших программах может быть довольно болезненным и иметь довольно много проблем, например несовместимость, которые затем привели бы к тому, что разработчику пришлось бы переписывать исходный код. Так что есть это, а также тот факт, что distutils является частью стандартной библиотеки python, тогда как setuptools - нет. Итак, если вы создаете программу на Python, в наши дни используйте setuptools, однако имейте в виду, что без distutils, setuptools никогда бы не существовали.

Кубаньчик
источник
3
«Distutils по-прежнему является стандартным инструментом для упаковки в Python». противоречит Руководству пользователя Python Packaging.
чел
1
Я так не думаю, явно ли сказано, что setuptools является стандартом. Также обратите внимание, что эта фраза была процитирована с предоставленного мной веб-сайта, так что это не мои слова. Однако это мнение, с которым я, как и многие другие люди, согласен.
Я наградил вас наградой, поскольку сообщество, похоже, с вами согласилось. К сожалению, этому вопросу не было уделено столько внимания, сколько мне хотелось бы.
чел
easy_install - основная причина, по которой я отказался от setuptools - для меня это был огромный источник проблем в пакетах, которые его используют (проще просто переупаковать). Остальные функции в порядке.
Стюарт Гэтман,
15

то, что setuptools отсутствует в стандартной библиотеке, единственная причина

Это одна из причин. Следующее прямо из NumPysetup.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 установки.

Фред Фу
источник
1
distributeбыла вилка setuptoolsи теперь слита обратно.
R4444
10

Есть несколько причин, по которым мы все еще говорим и используем distutils, хотя setuptools, без сомнения, лучший набор инструментов.

Во-первых, повсюду доступен distutils. Если вы хотите создать модуль для обмена с другими и у вас нет сложных требований, он гарантированно будет доступен на вашем рабочем компьютере. Это особенно важно, если вам нужно поддерживать старые версии python или если вы работаете в незнакомой среде.

Во-вторых, setuptools предоставляет расширения для distutils. Поэтому он смоделирован на основе набора инструментов distutils и берет оттуда всю его структуру. Документация для setuptools предполагает, что читатель знаком с distutils, и документирует только то, как он расширяет базовый набор инструментов. Вы можете подумать, что distutils определяет диалект, а setuptools улучшает этот диалект.

Мой личный подход к новым проектам основан на предположении, что я собираюсь использовать distutils. Я делаю обновление только по мере того, как проект разрастается, и ему требуется функция setuptools. Setuptools - это прямая замена для distutils, это однострочное изменение моего setup.py.

user590028
источник
Спасибо за Ваш ответ. Я думаю, что аргумент доступности не может быть таким важным, поскольку установка setuptools может быть загружена. Я вижу, что если distutils обеспечивает достаточную функциональность - есть смысл его использовать. Но смешивание distutils и setuptools, на мой взгляд, не очень чистый способ достижения целей. Хотя @larsmans в своем ответе показал некоторые трудности с инструментами настройки, которые заставляют использовать distutils для некоторых задач.
чел
9

В основном это связано с разделением обязанностей.

setuptoolsне является частью стандартной библиотеки Python, потому что поддерживается сторонней, а не основной командой Python. Что означает, среди прочего:

  • он не покрывается основным набором тестов и не зависит от основных функций
  • он сам по себе не устанавливает основных стандартов для дополнительных модулей (их расположение, средства импорта, двоичный интерфейс расширений C и т. д.).
  • он обновляется и выпускается независимо от выпусков Python

Фактически, основная команда сузила объем distutils , зарезервировав «основные стандарты» и «минимально необходимую компиляцию» для себя , оставив все остальное (расширенный компилятор / формат пакета / любая поддержка) сторонним разработчикам. Код, который ранее охватывал эти «расширенные части», остался устаревшим для обратной совместимости.

Из раздела Распространение модулей Python - документация Python 2.7.12 :

Хотя прямое использование distutilsпоэтапно прекращается, оно по-прежнему закладывает основу для существующей инфраструктуры упаковки и распространения, и оно не только остается частью стандартной библиотеки, но и сохраняет свое имя другими способами (например, именем списка рассылки). используется для координации разработки стандартов упаковки Python).

Пакеты для других операционных систем также являются , вероятно, обеспечит setuptoolsи pipотдельно - по вышеупомянутым причинам

  • и потому что они не нужны - или даже вредны для удобства обслуживания - когда в системе уже есть другой менеджер пакетов.
ivan_pozdeev
источник