Python ma mylące historię narzędzi, które mogą być używane do pakowania i opisać projekty: są to distutils
w Bibliotece standardowym distribute
, distutils2
oraz setuptools
(a może więcej). Wydaje się, że distribute
i distutils2
zostały przerwane na korzyść setuptools
, co pozostawia dwa konkurencyjne standardy.
W moim rozumieniu setuptools
oferuje 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
setuptools
do definiowania projektów i tworzenia dystrybucji źródłowych.
I wyjaśnia:
Chociaż można używać pure
distutils
w 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 przezsetuptools
. Będąc poza standardową biblioteką, setuptools oferuje także bardziej spójny zestaw funkcji w różnych wersjach Pythona i (w przeciwieństwiedistutils
)setuptools
zostanie 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życiusetuptools
.
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, distutils
a te, które obsługują, setuptools
często mieszają się setuptools
z, distutils
np. 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 setuptools
i distutils
. Często obejmuje to różne sposoby sprawdzania zależności podatne na błędy, ponieważ distutils
nie obsługuje zależności w funkcji konfiguracji.
Dlaczego ludzie wciąż dokładają dodatkowych starań, aby je wspierać distutils
- czy to, że setuptools
nie ma ich w standardowej bibliotece, jest jedynym powodem? Jakie są zalety distutils
i czy są jakieś wady pisania plików setup.py , które obsługują tylko setuptools
.
distutils
został z powrotem scalonysetuptools
, ale istnieją starsze aplikacje, które zostały napisane do użytku,distutils
a migracja do odpowiednich standardów wiąże się z kosztami.setuptools
jest ulepszoną alternatywą dla,distutils
ale pamiętaj, że „ Zalecany instalator pip uruchamia wszystkie skrypty setup.py zsetuptools
, nawet jeśli sam skrypt importuje tylkodistutils
” ( źródło )Odpowiedzi:
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?
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ł.
źródło
To jeden z powodów. Poniższe pochodzi prosto z NumPy
setup.py
:Więc NumPy woli,
setuptools
jeśli może to znaleźć. Ale potem SciPy to robił, dopóki nie został poprawiony, aby preferowaćdistutils
w niektórych sytuacjach. Cytując dziennik zatwierdzeń:Oczywiście, fuzja pomiędzy
setuptools
idistribute
powinno rozwiązać to wszystko w odpowiednim czasie, ale wiele pakietów nadal trzeba wspierać Python 2.6 instalacje.źródło
distribute
był rozwidleniemsetuptools
i jest teraz scalony z powrotem.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.
źródło
Zasadniczo wynika to z podziału obowiązków.
setuptools
nie jest częścią standardowej biblioteki Pythona, ponieważ jest obsługiwany przez stronę trzecią, a nie zespół podstawowy Pythona. Co oznacza między innymi: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 :
Pakiety dla innych systemów operacyjnych mogą również dostarczyć
setuptools
, apip
osobno - dla wyżej wymienionych powodówźródło