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…)


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ą.)


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.


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.


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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.