Różnice między dystrybucją, distutils, setuptools i distutils2?

594

Sytuacja

Próbuję przenieść bibliotekę typu open source do Python 3. ( SymPy , jeśli ktoś się zastanawia).

Tak więc muszę uruchamiać się 2to3automatycznie podczas budowania dla Pythona 3. Aby to zrobić, muszę użyć distribute. Dlatego muszę przenieść obecny system, który (zgodnie z doctest) jest distutils.


Problem

Niestety, nie jestem pewien, co jest różnica między tymi modules- distutils, distribute, setuptools. Dokumentacja jest jak najbardziej szkicowa, ponieważ wszystkie wydają się być wzajemnym rozwidleniem, które mają być kompatybilne w większości przypadków (ale w rzeczywistości nie wszystkie)… i tak dalej, i tak dalej.


Pytanie

Czy ktoś mógłby wyjaśnić różnice? Z czego mam korzystać? Jakie jest najnowocześniejsze rozwiązanie? (Nawiasem mówiąc, byłbym wdzięczny za przewodnik po portowaniu Distribute, ale jest to odrobina poza zakresem pytania…)

VPeric
źródło
22
Jak mylące? Przyszedłem do Pythona z Java / C ++. W takich sytuacjach dystrybucja jest bardzo prosta. Z Pythonem jestem całkowicie zdezorientowany w odniesieniu do wszystkich tych systemów dystrybucji.
Raffi Khatchadourian
75
Zgadzam się, pakowanie / instalacja Pythona ma zbyt wiele alternatyw bez jasnych wskazówek od społeczności.
Sabuncu
6
Chciałem tylko powiązać te powiązane informacje na pipie nieobsługującym
pixelbeat
@pixel pip obsługuje instalację kół (tak zwane dystrybucje binarne), ten link jest nieaktualny.
Flimm

Odpowiedzi:

836

Od marca 2020 r. Większość innych odpowiedzi na to pytanie jest kilka lat nieaktualna. Gdy natrafisz na porady dotyczące problemów z pakowaniem w Pythonie, pamiętaj, aby spojrzeć na datę publikacji i nie ufać nieaktualnym informacjom.

Python User Guide Opakowanie jest warta przeczytania. Na każdej stronie wyświetlana jest data „ostatniej aktualizacji”, dzięki czemu można sprawdzić aktualność instrukcji i jest ona dość obszerna. Fakt, że jest on hostowany w subdomenie python.org z Python Software Foundation, dodaje mu wiarygodności. Strona Podsumowania projektu jest szczególnie istotna tutaj.

Podsumowanie narzędzi:

Oto podsumowanie krajobrazu opakowań Pythona:

Obsługiwane narzędzia:

Przestarzałe / porzucone narzędzia:

  • distributebył widelcem setuptools. Współdzielił tę samą przestrzeń nazw, więc jeśli miałbyś zainstalowany Distribute, import setuptoolsfaktycznie zaimportowałby pakiet dystrybuowany z Distribute. Dystrybucja została z powrotem połączona z Setuptools 0.7 , więc nie musisz już używać Distribute. W rzeczywistości wersja Pypi to tylko warstwa zgodności, która instaluje narzędzia Setuptools.

  • distutils2Była to próba podjęcia najlepiej distutils, setuptoolsa distributei stać się standardowe narzędzie zawarte w standardowej biblioteki Pythona. Pomysł polegał na tym distutils2, że byłby dystrybuowany dla starszych wersji Pythona, a distutils2jego nazwa byłaby zmieniana packagingna Python 3.3, który zawierałby go w standardowej bibliotece. Plany te nie poszły jednak zgodnie z planem i obecnie distutils2są projektem opuszczonym . Najnowsza wersja została wydana w marcu 2012 r., A jej strona główna Pypi została w końcu zaktualizowana, aby odzwierciedlić jej śmierć.

Inne:

Istnieją inne narzędzia, jeśli jesteś zainteresowany, przeczytaj Streszczenia projektów w Podręczniku użytkownika Python Packaging. Nie będę ich wszystkich, aby nie powtarzać tę stronę i zachować dopasowanie odpowiedź na pytanie, co było tylko o distribute, distutils, setuptoolsi distutils2.

Rekomendacje:

Jeśli to wszystko jest dla Ciebie nowe i nie wiesz, od czego zacząć, zaleciłbym naukęsetuptools wraz z pipi virtualenv, które działają bardzo dobrze razem.

Jeśli szukasz w virtualenv, może być zainteresowany w tej kwestii: Jaka jest różnica między venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, etc? . (Tak, wiem, jęczę z tobą.)

Flimm
źródło
2
@makeramen: Zobacz ten wątek na liście mailingowej .
Flimm,
6
I nie wygląda już lepiej: 'Distribute' is a now deprecated fork of the 'Setuptools' project.@ PyPI Distribution page.
KurzedMetal
3
@KurzedMetal, według ludzi SetupTools, setuptools 0.7 przejmie zarówno dystrybucję, jak i stare setuptools, przywracając porządek we wszechświecie. Rzeczy mają się znacznie poprawić!
John McDonnell,
8
Python Packaging Podręcznik użytkownika będzie miała najbardziej up-to-date informacji na temat stanu opakowań Pythona. Zauważył to Nick Coughlan podczas PyCon 2013 .
imanuelcostigan
1
@Flimm Ostatnia edycja jest już dawno temu. Czy Bento jest już dojrzały?
Martin Thoma,
251

Jestem opiekunem distutils i współpracownikiem distutils2 / Packaging. Rozmawiałem na temat pakowania Pythona na ConFoo 2011 i obecnie piszę jego rozszerzoną wersję. Nie został jeszcze opublikowany, więc oto fragmenty, które powinny pomóc w zdefiniowaniu rzeczy.

  • Distutils to standardowe narzędzie używane do pakowania. Działa raczej dobrze w przypadku prostych potrzeb, ale jest ograniczony i nie jest łatwy do rozszerzenia.

  • Setuptools to projekt zrodzony z chęci uzupełnienia brakujących funkcji destutils i odkrywania nowych kierunków. W niektórych społecznościach jest to de facto standard. Wykorzystuje łatanie małp i magię, której nie sprzyjają twórcy rdzeni Python.

  • Dystrybucja jest rozwidleniem narzędzi Setuptools, które zostały zapoczątkowane przez programistów, którzy uważają, że jego tempo rozwoju jest zbyt wolne i że nie można go rozwinąć. Jego rozwój został znacznie spowolniony, gdy distutils2 została uruchomiona przez tę samą grupę. Aktualizacja 2013-sierpień: dystrybucja jest ponownie połączona w setuptools i wycofana.

  • Distutils2 to nowa biblioteka distutils, zapoczątkowana jako rozwidlenie bazy kodowej distutils, z dobrymi pomysłami zaczerpniętymi z narzędzi konfiguracyjnych (z których niektóre zostały dokładnie omówione w PEP) oraz z podstawowym instalatorem zainspirowanym pipem. Rzeczywista nazwa używana do importowania Distutils2 znajduje się packagingw standardowej bibliotece Python 3.3+ lub distutils2w wersjach 2.4+ i 3.1–3.2. (Backport będzie wkrótce dostępny.) Distutils2 nie wydał wersji Python 3.3 i został zawieszony.

Więcej informacji:

Mam nadzieję, że wkrótce ukończę mój przewodnik, który będzie zawierał więcej informacji o mocnych i słabych stronach każdej biblioteki oraz przewodnik przejścia.

Éric Araujo
źródło
1
Nie. Distutils2 bierze kilka dobrych pomysłów z setuptools / distribute, po standaryzacji (PEP) lub nie (na przykład mentoruję studenta GSoC, który dodaje polecenie programowania i automatyczne generowanie skryptów), ale nigdy nie będzie to drop-in wymiana: są pewne części, których nie chcemy (jajka, integracja VCS itp.). OTOH, distutils2 ma pewne rzeczy, których setuptools / distribute nie mają. Aby ułatwić przejście, myślę, że programiści dystrybucji mogą użyć distutils2 do obsługi nowych standardów i narzędzi; Myślę też, że pamiętam programistę setuptools, który powiedział, że chce wspierać nowe standardy.
Éric Araujo
1
Gdzie w tym wszystkim jest ez_setup? Czy są też jakieś aktualizacje statusu distutils2?
James McMahon
2
@ ÉricAraujo Przepraszamy za opóźnienie. Naprawdę mam nadzieję, że będzie gotowy na 3.4! Ja kocham Python, ale opakowanie zawsze mnie walić głową o ścianę. (W innych wiadomościach, jak idzie twój przewodnik? Jeśli jest skończony, czy możesz połączyć go w powyższej odpowiedzi?)
Zearin
9
@AlexisHuet Tego rodzaju komentarz byłby lepszy, gdyby zawierał link do komentarza poniżej (który można uzyskać za pomocą shareprzycisku).
erikbwork
2
być może powinieneś zaktualizować odpowiedź, aby wspomnieć, która distributezostała niedawno scalona z powrotem setuptools. Fakt, że większość dostępnych informacji jest przestarzała, przyczynia się do zamieszania
Amro
5

UWAGA: Odpowiedź jest przestarzała, Dystrybucja jest już nieaktualna. Ta odpowiedź nie jest już aktualna, ponieważ utworzono Urząd Pakowania Python i wykonał wiele pracy, aby to wyczyścić.


Tak, rozumiesz. : -o Myślę, że obecnie preferowanym pakietem jest Distribute , który jest rozwidleniem setuptools, które są rozszerzeniem distutils (oryginalny system pakowania). Narzędzie Setuptools nie było utrzymywane, więc zostało rozwidlone i zmieniono jego nazwę, jednak po zainstalowaniu używa nazwy pakietu setuptools! Myślę, że większość programistów Python używa teraz Distribute i mogę powiedzieć na pewno, że tak.

Keith
źródło
Dla przypomnienia, przyjąłem tę odpowiedź, ponieważ opowiedziała mi teraz o sytuacji (a widelcem jest rozszerzenie relacji, o którym nie wspomina obraz w drugiej odpowiedzi). I gdzieś po drodze dowiedziałem się również, że sama dokumentacja zwykle nie jest pewna, co próbuje powiedzieć.
VPeric
2
@VPeric, Rzeczywiście, dokumentacja odzwierciedla fakt, że ten aspekt Pythona jest w stanie flux / mess.
juanchopanza
2

Zdaję sobie sprawę, że odpowiedziałem na twoje drugie pytanie, nie odnosząc się do niekwestionowanych założeń w twoim pierwotnym problemie:

Próbuję przenieść bibliotekę typu open source (SymPy, jeśli ktoś się zastanawia) do Pythona 3. Aby to zrobić, muszę uruchomić 2to3 automatycznie podczas budowania dla Python 3.

Państwo może , nie trzeba . Inne strategie opisano na stronie http://docs.python.org/dev/howto/pyporting

Aby to zrobić, muszę użyć dystrybucji,

Państwo może :) distutils konwersję 2to3 podpory build-czasowy dla kodu (nie docstrings), w inny sposób dystrybucji to: http://docs.python.org/dev/howto/pyporting#during-installation

Éric Araujo
źródło
Dzięki, chociaż już zdecydowaliśmy się rozwiązać problem, pisząc nasz skrypt do obsługi konwersji. I tak, wiedziałem, że istnieją inne opcje niż użycie 2to3, ale SymPy to złożona baza kodu (około 200k + linii przy ostatnim sprawdzeniu) i użycie 2to3 było jedyną realistyczną strategią. W każdym razie jeszcze raz dziękuję!
VPeric
2

Aktualizacja tego pytania pod koniec 2014 r., Gdzie na szczęście chaos związany z pakowaniem w Pythonie został znacznie wyczyszczony przez menedżera pakietów „ conda ” Continuum .

W szczególności conda szybko umożliwia tworzenie „ środowisk ” conda . Możesz skonfigurować swoje środowiska za pomocą różnych wersji Pythona. Na przykład:

conda create -n py34 python=3.4 anaconda

conda create -n py26 python=2.6 anaconda

utworzy dwa środowiska Python („py34” lub „py26”) z różnymi wersjami języka Python.

Następnie możesz wywołać środowisko z określoną wersją Pythona za pomocą:

source activate <env name>

Ta funkcja wydaje się szczególnie przydatna w przypadku, gdy masz do czynienia z inną wersją Pythona.

Ponadto conda ma następujące funkcje:

  • Agnostyk Python
  • Cross platform
  • Nie są wymagane uprawnienia administratora
  • Inteligentne zarządzanie zależnościami (za pomocą solvera SAT)
  • Ładnie radzi sobie z bibliotekami na poziomie C, Fortran i systemowymi, z którymi możesz się połączyć

Ten ostatni punkt jest szczególnie ważny, jeśli jesteś na arenie naukowej.

Julien Chastang
źródło