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

Sytuacja

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

Więc, muszę uruchomić 2to3 automatycznie podczas budowania dla Pythona 3. Aby to zrobić, muszę użyć distribute. Dlatego muszę portować obecny system, który (zgodnie z doctestem) to distutils.


Problem

Niestety, nie jestem pewien, jaka jest różnica między tymi modułami-distutils, distribute, setuptools. Na dokumentacja jest szkicowa, jak najlepiej, ponieważ wszystkie wydają się być rozwidleniem siebie, przeznaczonym do kompatybilności w większości okoliczności (ale w rzeczywistości nie we wszystkich)...i tak dalej, i tak dalej.


Pytanie

Czy ktoś może wyjaśnić różnice? czego mam użyć? Jakie jest najnowocześniejsze rozwiązanie? (Na marginesie, byłbym również wdzięczny za jakiś przewodnik na temat portowania do Distribute, ale to trochę poza zakresem pytania...)

Author: Flimm, 2011-06-14

7 answers

[21]} od stycznia 2017 r. wszystkie pozostałe odpowiedzi na to pytanie są co najmniej dwa lata nieaktualne. Kiedy natkniesz się na porady dotyczące kwestii pakowania Pythona, pamiętaj, aby spojrzeć na datę publikacji i nie ufaj nieaktualnym informacjom.

Podręcznik Użytkownika Python Packaging jest wart przeczytania. Na każdej stronie wyświetlana jest Data "ostatniej recenzji", więc możesz sprawdzić aktualność podręcznika i jest on dość obszerny. Fakt, że jest on hostowany na subdomenie python.org Python Software Foundation dodaje tylko credence do niego. Szczególnie istotna jest tutaj Strona streszczenia projektów .

Podsumowanie narzędzi:

Oto podsumowanie środowiska opakowań Pythona w styczniu 2017 r.:]}

Obsługiwane narzędzia:

  • Distutils {[39] } jest nadal standardowym narzędziem do pakowania w Pythonie. Jest on zawarty w bibliotece standardowej (Python 2 i Python 3.0 do 3.6). Jest to przydatne dla prostego Pythona dystrybucji, ale brakuje jej funkcji. Wprowadza on pakiet distutils Pythona, który można zaimportować do skryptu setup.py.

  • Setuptools został opracowany w celu przezwyciężenia ograniczeń Distutils i nie jest zawarty w bibliotece standardowej. Wprowadzono narzędzie wiersza poleceń o nazwie easy_install. Wprowadzono również Pakiet setuptools Pythona, który można importować w skrypcie setup.py i pakiecie pkg_resources Pythona, który można zaimportować do kodu w celu zlokalizowania plików danych zainstalowanych w dystrybucji. Jednym z jego elementów jest to, że instaluje pakiet distutils Pythona. Powinno dobrze działać z pip. widzi regularne wydania.

  • Scikit-build jest ulepszonym generatorem systemu budowania, który wewnętrznie używa CMake do budowania skompilowanych rozszerzeń Pythona. Ponieważ scikit-build nie jest oparty na distutils, tak naprawdę nie ma żadnych ograniczeń. Kiedy ninja-build jest obecny, scikit-build może kompilować duże projekty ponad trzy razy szybciej niż alternatywy. Powinno dobrze działać z pip. widzi regularne wydania.

Przestarzałe / porzucone narzędzia:

  • Distribute to widelec Setuptools. Udostępnił tę samą przestrzeń nazw, więc jeśli zainstalowałeś Distribute, import setuptools zaimportowałby pakiet dystrybuowany za pomocą Distribute. dystrybucja została ponownie połączona z Setuptools 0.7, więc nie musisz już używać dystrybucji. W rzeczywistości wersja na Pypi jest tylko warstwa kompatybilności instalująca narzędzia Setuptools.

  • Distutils2 był próbą wykorzystania najlepszych narzędzi Distutils, Setuptools i Distribute, aby stać się standardowym narzędziem dostępnym w bibliotece standardowej Pythona. Pomysł polegał na tym, że Distutils2 będzie dystrybuowany dla starych wersji Pythona i że Distutils2 zostanie przemianowany na packaging dla Pythona 3.3, który włączy go do swojej standardowej biblioteki. Plany te nie poszły jednak zgodnie z założeniami i obecnie, Distutils2 to porzucony projekt. Najnowsza wersja miała miejsce w marcu 2012 roku, a strona domowa Pypi została ostatecznie zaktualizowana, aby odzwierciedlić jego śmierć.

Alpha software:

  • Distlib jest narzędziem, które ma na celu zaimplementowanie podzbioru funkcjonalności poprzednich narzędzi, ale tylko funkcjonalności, która jest bardzo dobrze zdefiniowana w akceptowanych PEPs. Jest to jedno z narzędzi PyPA (Python Package Authority) i powinno być dołączona ostatecznie do biblioteki standardowej Pythona. jest nadal uważany za oprogramowanie alfa, więc użytkownicy końcowi uważaj.

  • Bento), ale nie wspomnę o nich, ponieważ są zbyt niejasne, niszowe, wczesne lub nierozwinięte do tego odpowiedz na post, bo inaczej nie są bezpośrednią alternatywą.

Zalecenie:

Podsumowując, ze wszystkich tych opcji, Polecam Setuptools , chyba że Twoje wymagania są bardzo podstawowe i potrzebujesz tylko Distutils. Setuptools działa bardzo dobrze z Virtualenv i Pip, narzędzi, które Gorąco polecam. Virtualenv i Pip mogą być uznane za oficjalne, ponieważ są częścią PyPA, a Python 3 Teraz statki ensurepip (który pomaga w instalacji pip na niektórych systemach).

Jeśli szukasz Virtualenv, może zainteresuje cię to pytanie: Jaka jest różnica między venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, itd?. (Tak, wiem, jęczę z Tobą.)

Na marginesie, zalecam użycie Virtualenv 1.10 lub wyższej, ponieważ jest to pierwsze wydanie, które rozpoznaje fuzję Setuptools / Distribute, zarówno dla Pythona 2, jak i 3.

 790
Author: Flimm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-23 01:13:30

Jestem opiekunem distutils i dostawcą distutils2 / packaging. Rozmawiałem o pakiecie Pythona na ConFoo 2011 i obecnie piszę jego rozszerzoną wersję. Nie jest jeszcze opublikowany, więc oto fragmenty, które powinny pomóc zdefiniować rzeczy.

  • Distutils jest standardowym narzędziem używanym do pakowania. Działa raczej dobrze dla prostych potrzeb, ale jest ograniczony i nie trywialny do rozszerzenia.

  • Setuptools to projekt zrodzony z pragnienia aby wypełnić brakujące funkcje distutils i odkrywać nowe kierunki. W niektórych regionach jest to standard de facto. Wykorzystuje łatanie małp i magię, która jest marszczona przez programistów rdzeni Pythona.

  • Distribute to fork Setuptools, który został uruchomiony przez programistów, którzy czuli, że jego tempo rozwoju jest zbyt wolne i że nie można go rozwijać. Jego rozwój został znacznie spowolniony, gdy distutils2 została uruchomiona przez tę samą grupę. 2013-aktualizacja z sierpnia: dystrybucja jest ponownie połączona z setuptools i wycofana.

  • Distutils2 to nowa biblioteka distutils, powstała jako fork bazy kodowej distutils, z dobrymi pomysłami zaczerpniętymi z narzędzi instalacyjnych (z których niektóre zostały dokładnie omówione w PEPs) i podstawowym instalatorem inspirowanym pip. rzeczywista nazwa używana do importowania Distutils2 to packaging w bibliotece standardowej Pythona 3.3+ lub distutils2 w bibliotekach 2.4+ i 3.1–3.2. (Backport będzie dostępny wkrótce.) Distutils2 nie doczekało się Wydania Pythona 3.3 i zostało wstrzymane.

Więcej informacji:

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

 251
Author: Éric Araujo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-13 23:17:16

Uwaga: odpowiedź przestarzała, Dystrybucja przestarzała.

Jasne. :- o myślę, że w tej chwili preferowanym pakietem jest Distribute , który jest forkiem setuptools, które są rozszerzeniem distutils (oryginalnego systemu pakowania). Setuptools nie był utrzymywany, więc został rozwidlony i przemianowany, jednak po zainstalowaniu używa nazwy pakietu setuptools! Myślę, że większość programistów Pythona używa teraz dystrybucji i mogę powiedzieć na pewno, że tak.

 7
Author: Keith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-17 17:32:34

Aktualizacja tego pytania pod koniec 2014 roku, gdzie na szczęście chaos w pakietach w Pythonie został znacznie oczyszczony przez menedżera pakietów Continuum "conda".

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 ("py34 "lub" py26") środowiska Pythona z różnymi wersjami 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 Twoim przypadku, gdy masz do czynienia z różnymi wersjami Pythona.

Ponadto conda ma następujące cechy:

  • Python agnostic
  • Cross platform
  • nie wymaga uprawnień administratora
  • Inteligentne zarządzanie zależnościami (za pomocą SAT solvera)]}
  • ładnie układa się z C, Fortran i biblioteki na poziomie systemowym, z którymi możesz się połączyć]}
Ten ostatni punkt jest szczególnie ważny, jeśli jesteś na arenie informatyki naukowej.
 4
Author: Julien Chastang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-29 21:26:30

Wiele osób skarżyło się tutaj na brak jasnych wytycznych społeczności w tej sprawie.

Obecnie wygląda to na najlepsze autorytatywne źródło rekomendacji narzędzi: https://packaging.python.org/en/latest/current.html#tool-recommendations

 4
Author: Lucas Cimon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-03 09:39:10

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

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

Ty możesz , a nie potrzebujesz . Inne strategie są opisane w http://docs.python.org/dev/howto/pyporting

Aby to zrobić, potrzebuję aby użyć distribute,

You may :) distutils obsługuje konwersję 2to3 w czasie kompilacji dla kodu (nie docstrings), w inny sposób, który dystrybuuje: http://docs.python.org/dev/howto/pyporting#during-installation

 3
Author: Éric Araujo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-29 14:16:08

Ten temat wydaje się być wciąż w ruchu. Od 10-31-2013 "Python Packaging User Guide "Quick Recommendations definiuje "jaki zestaw narzędzi jest obecnie zalecany". Jest to również link do "The Future of Python Packaging "

 2
Author: Love and peace - Joe Codeswell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-01 18:49:42