setuptools vs. distutils: dlaczego distutils wciąż jest czymś?

143

Python ma mylące historię narzędzi, które mogą być używane do pakowania i opisać projekty: są to distutilsw Bibliotece standardowym distribute, distutils2oraz setuptools(a może więcej). Wydaje się, że distributei distutils2zostały przerwane na korzyść setuptools, co pozostawia dwa konkurencyjne standardy.

W moim rozumieniu setuptoolsoferuje znacznie więcej opcji (np. Deklarowanie zależności, testów itp.) Niż distutils, jakkolwiek nie jest to zawarte w standardowej bibliotece Pythona (jeszcze?).

User Python Opakowanie przewodnik [ 1 ] zaleca się:

Służy setuptoolsdo definiowania projektów i tworzenia dystrybucji źródłowych.

I wyjaśnia:

Chociaż można używać pure distutilsw wielu projektach, nie obsługuje on definiowania zależności w innych projektach i brakuje kilku wygodnych narzędzi do automatycznego wypełniania metadanych pakietów, które są dostarczane przez setuptools. Będąc poza standardową biblioteką, setuptools oferuje także bardziej spójny zestaw funkcji w różnych wersjach Pythona i (w przeciwieństwie distutils) setuptoolszostanie zaktualizowany, aby tworzyć nadchodzące standardowe formaty „Metadata 2.0” we wszystkich obsługiwanych wersjach.

Nawet w przypadku projektów, które zdecydują się użyć distutils, gdy pip instaluje takie projekty bezpośrednio ze źródła (zamiast instalować z wstępnie utworzonego pliku koła), w rzeczywistości utworzy projekt przy użyciu setuptools.

Jednak przyjrzenie się plikom setup.py różnych projektów ujawnia, że ​​nie wydaje się to być rzeczywistym standardem. Wiele pakietów nadal używa, distutilsa te, które obsługują, setuptoolsczęsto mieszają się setuptoolsz, distutilsnp. Wykonując import awaryjny:

try:
    from setuptools import setup
except ImportError:
    from distutils.core import setup

Następnie próbowano znaleźć sposób na napisanie konfiguracji, która może być zainstalowana zarówno przez, jak setuptoolsi distutils. Często obejmuje to różne sposoby sprawdzania zależności podatne na błędy, ponieważ distutilsnie obsługuje zależności w funkcji konfiguracji.

Dlaczego ludzie wciąż dokładają dodatkowych starań, aby je wspierać distutils- czy to, że setuptoolsnie ma ich w standardowej bibliotece, jest jedynym powodem? Jakie są zalety distutilsi czy są jakieś wady pisania plików setup.py , które obsługują tylko setuptools.

cel
źródło
4
distutilszostał z powrotem scalonysetuptools , ale istnieją starsze aplikacje, które zostały napisane do użytku, distutilsa migracja do odpowiednich standardów wiąże się z kosztami.
metatoaster
3
„Wygląda na to, że dystrybucja i distutils2 zostały przerwane na rzecz setuptools”, zgadza się, dystrybucja jest teraz tylko opakowaniem dla setuptools, a distutils2 jest martwy.
kay - SE is evil
1
setuptoolsjest ulepszoną alternatywą dla, distutilsale pamiętaj, że „ Zalecany instalator pip uruchamia wszystkie skrypty setup.py z setuptools, nawet jeśli sam skrypt importuje tylkodistutils ” ( źródło )
user2314737

Odpowiedzi:

77

Spójrz na to pytanie SO. Bardzo dobrze wyjaśnia wszystkie metody pakowania i może w pewnym stopniu pomóc odpowiedzieć na twoje pytanie: różnice między dystrybucją, distutils, setuptools i distutils2?

Distutils jest nadal standardowym narzędziem do pakowania w Pythonie. Jest zawarty w bibliotece standardowej (Python 2 i Python 3.0 do 3.3). Jest przydatny w przypadku prostych dystrybucji Pythona, ale brakuje mu funkcji. Przedstawia pakiet distutils Python, który można zaimportować do skryptu setup.py.

Setuptools zostało opracowane w celu przezwyciężenia ograniczeń Distutils i nie jest zawarte w standardowej bibliotece. Wprowadził narzędzie wiersza poleceń o nazwie easy_install. Wprowadzono także pakiet setuptools Python, który można zaimportować w skrypcie setup.py, oraz pakiet pkg_resources Python, który można zaimportować do kodu w celu zlokalizowania plików danych zainstalowanych wraz z dystrybucją. Jedną z jego pułapek jest to, że małpuje łatki do pakietu Distutils Python. Powinien dobrze działać z pipem. Najnowsza wersja została wydana w lipcu 2013.

Tak więc, jak widzisz, należy preferować setuptools zamiast distutils i widzę, skąd pochodzi twoje pytanie, jednak nie widzę, aby distutils stracił wsparcie w najbliższym czasie, ponieważ, po prostu, jest używany w wielu przypadkach z niektórymi popularnymi starszymi programami . I jak zapewne wiesz, zmiana tego typu rzeczy w starszych programach może być dość uciążliwa i wiązać się z kilkoma problemami, na przykład niezgodnościami, które doprowadziłyby do tego, że programista musiałby przepisać kod źródłowy. Więc jest to, a także fakt, że distutils jest częścią standardowej biblioteki Pythona, podczas gdy setuptools nie. Tak więc, jeśli tworzysz program w języku Python, w dzisiejszych czasach użyj setuptools, jednak pamiętaj, że bez distutils, setuptools nigdy by nie istniał.

kubańczyk
źródło
3
„Distutils to nadal standardowe narzędzie do pakowania w Pythonie”. jest sprzeczne z podręcznikiem użytkownika Python Packaging.
cel
1
Nie sądzę, czy wyraźnie mówi się, że setuptools jest standardem. Zwróć również uwagę, że to wyrażenie zostało zacytowane z podanej przeze mnie strony internetowej, więc to nie są moje słowa. Jest to jednak opinia, z którą zgadzam się wśród wielu innych osób.
Przyznałem ci nagrodę, ponieważ społeczność wydaje się zgadzać z tobą. Niestety, to pytanie nie wzbudziło tak dużego zainteresowania, jak bym chciał.
cel
easy_install jest głównym powodem, dla którego odrzuciłem setuptools - było to dla mnie ogromne źródło problemów w pakietach, które go używają (łatwiej jest po prostu przepakować). Inne funkcje są w porządku.
Stuart Gathman
14

to fakt, że setuptools nie znajduje się w standardowej bibliotece, jedynym powodem

To jeden z powodów. Poniższe pochodzi prosto z 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

Więc NumPy woli, setuptoolsjeśli może to znaleźć. Ale potem SciPy to robił, dopóki nie został poprawiony, aby preferować distutilsw niektórych sytuacjach. Cytując dziennik zatwierdzeń:

Setuptools sets mode +x on the test scripts, so that Nose refuses to run
them. Better not do that.

Oczywiście, fuzja pomiędzy setuptoolsi distributepowinno rozwiązać to wszystko w odpowiednim czasie, ale wiele pakietów nadal trzeba wspierać Python 2.6 instalacje.

Fred Foo
źródło
1
distributebył rozwidleniem setuptoolsi jest teraz scalony z powrotem.
R4444
10

Jest kilka powodów, dla których wciąż rozmawiamy i używamy distutils, mimo że setuptools jest bez wątpienia lepszym zestawem narzędzi.

Po pierwsze, distutils są dostępne wszędzie. Jeśli chcesz zbudować moduł do udostępniania innym i nie masz żadnych skomplikowanych wymagań, na pewno będzie on dostępny na Twojej maszynie roboczej. Jest to szczególnie ważne, jeśli musisz obsługiwać starsze wersje Pythona lub jeśli pracujesz w nieznanym środowisku.

Po drugie, setuptools zapewnia ulepszenia distutils. Dlatego jest modelowany na podstawie zestawu narzędzi distutils i stamtąd bierze całą swoją strukturę. Dokumentacja dla setuptools zakłada, że ​​czytelnik jest zaznajomiony z distutils i dokumentuje tylko, w jaki sposób ulepsza on podstawowy zestaw narzędzi. Możesz pomyśleć o tym, że distutils definiuje dialekt, a setuptools wzmacnia ten dialekt.

Moje osobiste podejście do nowych projektów zaczyna się od założenia, że ​​będę używał distutils. Dopiero gdy projekt będzie wymagał funkcji setuptools, dokonuję aktualizacji. Setuptools jest bezpośrednim zamiennikiem dla distutils, jest to zmiana w jednym wierszu w moim setup.py.

user590028
źródło
Dziękuję za odpowiedź. Myślę, że argument dostępności nie może być aż tak ważny, ponieważ instalację setuptools można załadować. Widzę, że jeśli distutils zapewnia wystarczającą funkcjonalność - to ma sens. Jednak moim zdaniem mieszanie distutils i setuptools nie jest zbyt czystym sposobem na osiągnięcie swoich celów. Chociaż @larsmans pokazał w swojej odpowiedzi pewne trudności z narzędziami konfiguracyjnymi, które wymuszają używanie distutils do niektórych zadań.
cel
9

Zasadniczo wynika to z podziału obowiązków.

setuptoolsnie jest częścią standardowej biblioteki Pythona, ponieważ jest obsługiwany przez stronę trzecią, a nie zespół podstawowy Pythona. Co oznacza między innymi:

  • nie jest objęty podstawowym zestawem testów i nie jest zależny od podstawowych funkcji
  • to nie jest samo wyznacza podstawowych standardów dla modułów dodatkowych (ich lokalizacja, sposób importu, binarny interfejs rozszerzeń C itp.).
  • jest aktualizowany i wydawany niezależnie od wydań języka Python

W efekcie, główny zespół zawęził zakres dystrybucji , rezerwując dla siebie części „podstawowych standardów” i „minimalnej niezbędnej kompilacji” , pozostawiając wszystko poza tym (rozszerzony kompilator / format pakietu / jakiekolwiek wsparcie) stronom trzecim. Kod, który wcześniej obejmował te „rozszerzone części”, pozostał nieaktualny celu zapewnienia zgodności z poprzednimi wersjami.

From Distributing Python Modules - Python 2.7.12 dokumentacja :

Chociaż bezpośrednie korzystanie z programu distutilsjest wycofywane, nadal stanowi on podstawę dla obecnej infrastruktury pakowania i dystrybucji i nie tylko pozostaje częścią standardowej biblioteki, ale jego nazwa żyje na inne sposoby (np. Nazwa listy mailingowej używany do koordynowania rozwoju standardów pakowania w języku Python).

Pakiety dla innych systemów operacyjnych mogą również dostarczyć setuptools, a piposobno - dla wyżej wymienionych powodów

  • i ponieważ nie są one konieczne - a nawet są szkodliwe dla łatwości utrzymania - gdy w systemie jest już inny menedżer pakietów.
ivan_pozdeev
źródło