Sytuacja
Próbuję przenieść bibliotekę typu open source do Python 3. ( SymPy , jeśli ktoś się zastanawia).
Tak więc muszę uruchamiać się 2to3
automatycznie 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…)
Odpowiedzi:
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:
distutils
jest nadal standardowym narzędziem do pakowania w Pythonie. Jest zawarty w standardowej bibliotece (Python 2 i Python 3). Jest to przydatne w przypadku prostych dystrybucji w języku Python, ale brakuje w nim funkcji. Wprowadzadistutils
pakiet Python, który można zaimportować dosetup.py
skryptu.distutils
sekcja Podręcznika użytkownika pakietu Pythonsetuptools
został opracowany w celu przezwyciężenia ograniczeń Distutils i nie jest zawarty w standardowej bibliotece. Wprowadzono narzędzie wiersza polecenia o nazwieeasy_install
. Wprowadzono równieżsetuptools
pakiet Python, który można zaimportować dosetup.py
skryptu, orazpkg_resources
pakiet Python, który można zaimportować do kodu w celu zlokalizowania plików danych zainstalowanych z dystrybucją. Jednym z jego problemów jest to, że łatadistutils
pakiet Pythona w małpę . Powinien dobrze współpracowaćpip
. Widzi regularne wydania.setuptools
sekcja Podręcznika użytkownika pakietu Pythonscikit-build
jest ulepszonym generatorem systemu kompilacji, który wewnętrznie wykorzystuje CMake do budowania skompilowanych rozszerzeń Pythona. Ponieważ scikit-build nie jest oparty na distutils, tak naprawdę nie ma żadnych ograniczeń. Gdy jest dostępna kompilacja ninja, scikit-build może kompilować duże projekty ponad trzy razy szybciej niż alternatywy. Powinien dobrze współpracowaćpip
.scikit-build
sekcja Podręcznika użytkownika pakietu Pythondistlib
to biblioteka zapewniająca funkcje używane przez narzędzia wyższego poziomu, takie jakpip
.distlib
sekcja Podręcznika użytkownika pakietu Pythonpackaging
to także biblioteka zapewniająca funkcjonalność wykorzystywaną przez narzędzia wyższego poziomu, takie jakpip
isetuptools
packaging
sekcja Podręcznika użytkownika pakietu PythonPrzestarzałe / porzucone narzędzia:
distribute
był widelcemsetuptools
. Współdzielił tę samą przestrzeń nazw, więc jeśli miałbyś zainstalowany Distribute,import setuptools
faktycznie 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.distutils2
Była to próba podjęcia najlepiejdistutils
,setuptools
adistribute
i stać się standardowe narzędzie zawarte w standardowej biblioteki Pythona. Pomysł polegał na tymdistutils2
, że byłby dystrybuowany dla starszych wersji Pythona, adistutils2
jego nazwa byłaby zmienianapackaging
na Python 3.3, który zawierałby go w standardowej bibliotece. Plany te nie poszły jednak zgodnie z planem i obecniedistutils2
są 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
,setuptools
idistutils2
.Rekomendacje:
Jeśli to wszystko jest dla Ciebie nowe i nie wiesz, od czego zacząć, zaleciłbym naukę
setuptools
wraz zpip
ivirtualenv
, które działają bardzo dobrze razem.Jeśli szukasz w
virtualenv
, może być zainteresowany w tej kwestii: Jaka jest różnica międzyvenv
,pyvenv
,pyenv
,virtualenv
,virtualenvwrapper
, etc? . (Tak, wiem, jęczę z tobą.)źródło
'Distribute' is a now deprecated fork of the 'Setuptools' project.
@ PyPI Distribution page.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ęDistutils2 nie wydał wersji Python 3.3 i został zawieszony.packaging
w standardowej bibliotece Python 3.3+ lubdistutils2
w wersjach 2.4+ i 3.1–3.2. (Backport będzie wkrótce dostępny.)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.
źródło
share
przycisku).distribute
została niedawno scalona z powrotemsetuptools
. Fakt, że większość dostępnych informacji jest przestarzała, przyczynia się do zamieszaniaUWAGA: 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.
źródło
Zdaję sobie sprawę, że odpowiedziałem na twoje drugie pytanie, nie odnosząc się do niekwestionowanych założeń w twoim pierwotnym problemie:
Państwo może , nie trzeba . Inne strategie opisano na stronie http://docs.python.org/dev/howto/pyporting
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
źródło
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:
Ten ostatni punkt jest szczególnie ważny, jeśli jesteś na arenie naukowej.
źródło