setuptools vs. distutils: чому distutils все ще є річчю?


143

Python має заплутану історію інструментів , які можуть бути використані для упаковки і опису проектів: вони включають distutilsв стандартній бібліотеці, distribute, distutils2і setuptools(а можуть і більше). Виявляється , що distributeі distutils2були припинені на користь setuptools, яка залишає два конкуруючих стандартів.

Наскільки я розумію, setuptoolsпропонуються набагато більше варіантів (наприклад, декларування залежностей, тестів тощо) distutils, однак вони не входять у стандартну бібліотеку Python (ще?).

Python Упаковка Керівництво користувача [ 1 ] рекомендує в даний час:

Використовуйте setuptoolsдля визначення проектів та створення дистрибутивів.

І пояснює:

Хоча ви можете використовувати pure distutilsдля багатьох проектів, він не підтримує визначення залежностей від інших проектів і не має кількох зручних утиліт для автоматичного заповнення метаданих пакунків, які надаються setuptools. Знаходячись поза стандартною бібліотекою, setuptools також пропонує більш послідовний набір функцій для різних версій Python, і (на відміну від них distutils) setuptoolsбуде оновлено для створення майбутніх стандартних форматів "Metadata 2.0" для всіх підтримуваних версій.

Навіть для проектів, які вирішили використовувати distutils, коли pip встановлює такі проекти безпосередньо з джерела (а не встановлення з попередньо вбудованого файлу колеса), він фактично будує ваш проект, використовуючи 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і для перенесення стандартів необхідні витрати.
метатостер

3
"Здається, що дистрибуція та distutils2 були припинені на користь setuptools", виправити, розповсюдження - це лише обгортка для setuptools, а distutils2 мертва.
Кей - SE це зло

1
setuptoolsє розширеною альтернативою, distutilsале зауважте, що " Рекомендований інсталятор pip запускає всі сценарії setup.py setuptools, навіть якщо сам сценарій лише імпортуєdistutils " ( джерело )
user2314737

Відповіді:


77

Погляньте на це питання ТАК Це дуже добре пояснює всі способи упаковки і може допомогти певною мірою відповісти на ваше запитання: Відмінності між розподілом, distutils, setuptools та distutils2?

Distutils все ще є стандартним інструментом для упаковки в Python. Він включений до стандартної бібліотеки (Python 2 та Python 3.0 до 3.3). Це корисно для простих дистрибутивів Python, але не має функцій. Він представляє пакунок distutils Python, який можна імпортувати у ваш сценарій setup.py.

Setuptools був розроблений для подолання обмежень Distutils і не входить до стандартної бібліотеки. Він представив утиліту командного рядка під назвою easy_install. Він також представив пакет налаштування Python, який можна імпортувати у ваш setup.py скрипт, і пакет pkg_resources Python, який можна імпортувати у ваш код, щоб знайти файли даних, встановлені з розподілом. Один з його моментів - це те, що він мавпочки виправляє пакунок distutils Python. Він повинен добре працювати з піп. Остання версія була випущена в липні 2013 року.

Отже, як ви можете бачити, що setuptools слід віддавати перевагу дистрибутивам, і я бачу, звідки береться ваше запитання, однак я не бачу, щоб distutils втрачав підтримку незабаром, оскільки, просто кажучи, він використовується у багатьох випадках із деякими популярними застарілими програмами . І як ви, напевно, знаєте, що змінити такі речі в застарілих програмах можуть бути досить болючою ситуацією і матимуть чимало проблем, наприклад, несумісності, що призведе до того, що розробнику доведеться переписати вихідний код. Отже, є і те, що distutils є частиною стандартної бібліотеки python, тоді як setuptools - ні. Отже, якщо ви створюєте програму python, в цей день і вік використовуйте setuptools, однак пам’ятайте, що без distutils, setuptools ніколи не існували б.


3
"Distutils все ще є стандартним інструментом для упаковки в Python." суперечить Посібнику користувача упаковки Python.
чел

1
Я не вірю в це, чи чітко сказано, що setuptools - це стандарт. Також зауважте, що ця фраза цитувалася з веб-сайту, який я надав, тож це не мої слова. Однак це думка, з якою я, серед багатьох інших людей, згоден.

Я нагородив вас винагородою, оскільки громада, здається, погоджується з вами. На жаль, це питання не приділяло такої уваги, як я хотів би отримати.
віч

easy_install - головна причина, що я відхилив setuptools - це було величезним джерелом проблем для мене в пакетах, які його використовують (простіше просто перепакувати). Інші функції в порядку.
Стюарт Гетман

14

є той факт, що 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.


Дякую за вашу відповідь. Я думаю, що аргумент доступності не може бути таким важливим, оскільки установка setuptools може бути завантажена. Я бачу, що якщо distutils забезпечує достатню функціональність - це має сенс використовувати. Але змішування distutils та setuptools, на мою думку, не дуже чистий спосіб досягти своїх цілей. Хоча @larsmans показав у своїй відповіді деякі труднощі з setuptools, які змушують використовувати distutils для деяких завдань.
віл

9

В основному, це пов'язано з розподілом обов'язків.

setuptoolsне є частиною стандартної бібліотеки Python, оскільки її підтримує третя сторона, а не основна команда Python. Що означає, серед іншого:

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

Ефективно, основна команда звузила сферу використання дистрибутивів , зарезервувавши "основні стандарти" та "мінімально необхідну компіляцію" частини для себе , залишаючи всі речі поза цим (розширений компілятор / формат пакету / будь-яку підтримку) третім сторонам. Код, який раніше охоплював ці "розширені частини", залишався несвіжим для зворотної сумісності.

З розповсюдження модулів Python - документація Python 2.7.12 :

Незважаючи на те, що пряме використання distutilsпоступово припиняється, воно все ще заклало основу для поточної інфраструктури упаковки та розповсюдження, і воно не тільки залишається частиною стандартної бібліотеки, але її назва продовжує жити іншими способами (наприклад, назва списку розсилки використовується для координації розробки стандартів упаковки Python).

Пакети для інших ОС можуть також надаватися setuptoolsі pipокремо - з вищезазначених причин

  • і тому, що вони не потрібні - або навіть згубні для ремонту - коли в системі вже є інший менеджер пакунків.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.