Differenze tra distribut, distutils, setuptools e distutils2?


594

La situazione

Sto provando a portare una libreria open source su Python 3. ( SymPy , se qualcuno si sta chiedendo.)

Quindi, devo eseguire 2to3automaticamente quando si crea per Python 3. Per farlo, devo usare distribute. Pertanto, devo portare il sistema attuale, che (secondo il doctest) è distutils.


Il problema

Purtroppo, io non sono sicuro di quello che è la differenza tra questi MODULI distutils, distribute, setuptools. La documentazione è imprecisa nel modo migliore, in quanto sembrano essere una forcella reciproca, intesa per essere compatibile nella maggior parte dei casi (ma in realtà, non tutti) ... e così via, e così via.


La domanda

Qualcuno potrebbe spiegare le differenze? Cosa dovrei usare? Qual è la soluzione più moderna? (A parte, apprezzerei anche qualche guida sul porting Distribute, ma questo è un po 'oltre lo scopo della domanda ...)


22
Quanto confuso? Sono arrivato a Python da uno sfondo Java / C ++. In tali situazioni, la distribuzione è molto semplice. Con Python, I a, completamente confuso riguardo a tutti questi sistemi di distribuzione.
Raffi Khatchadourian,

75
Sono d'accordo, l'imballaggio / installazione di Python ha troppe alternative senza una chiara guida da parte della comunità.
Sabuncu,

6
Volevo solo collegare queste informazioni correlate su pip che non supporta le distribuzioni binarie lucumr.pocoo.org/2012/6/22/hate-hate-hate-everywhere
pixelbeat

@pixelbeat pip supporta l'installazione di ruote (le cosiddette distribuzioni binarie), quel collegamento non è aggiornato.
Flimm

Risposte:


836

A partire da marzo 2020, la maggior parte delle altre risposte a questa domanda sono obsolete da diversi anni. Quando ti imbatti in consigli su problemi di packaging di Python, ricordati di guardare la data di pubblicazione e non fidarti di informazioni obsolete.

La Guida per l'utente Packaging Python è la pena di leggere. Ogni pagina ha una data di "ultimo aggiornamento" visualizzata, quindi puoi controllare la recency del manuale ed è abbastanza completa. Il fatto che sia ospitato su un sottodominio di python.org della Python Software Foundation aggiunge semplicemente credibilità ad esso. La pagina Riepiloghi progetti è particolarmente rilevante qui.

Riepilogo degli strumenti:

Ecco un riepilogo del panorama del packaging di Python:

Strumenti supportati:

Strumenti obsoleti / abbandonati:

  • distributeera una forchetta di setuptools. Condivide lo stesso spazio dei nomi, quindi se avevi installato Distribuire, in import setuptoolsrealtà importa il pacchetto distribuito con Distribuisci. Distribuisci è stato riunito nuovamente in Setuptools 0.7 , quindi non è più necessario utilizzare Distribuisci. In effetti, la versione su Pypi è solo un livello di compatibilità che installa Setuptools.

  • distutils2era un tentativo di prendere il meglio di distutils, setuptoolsed distributee diventare lo strumento standard incluso nella libreria standard di Python. L'idea era che distutils2sarebbe stato distribuito per le vecchie versioni di Python e che distutils2sarebbe stato rinominato packagingper Python 3.3, che lo avrebbe incluso nella sua libreria standard. Questi piani non sono andati come previsto, tuttavia, e attualmente, distutils2è un progetto abbandonato . L'ultima versione risale al marzo 2012 e la sua home page di Pypi è stata finalmente aggiornata per riflettere la sua morte.

Altri:

Esistono altri strumenti, se interessati, leggere i riepiloghi dei progetti nella Guida per l'utente di Python Packaging. Io non li elencherò, per non ripetere quella pagina, e per mantenere la risposta corrispondente alla domanda, che era solo circa distribute, distutils, setuptoolse distutils2.

Raccomandazione:

Se tutto ciò è nuovo per te e non sai da dove cominciare, consiglierei di impararesetuptools insieme a pipe virtualenv, che funzionano tutti molto bene insieme.

Se stai cercando in virtualenv, potreste essere interessati a questa domanda: Qual è la differenza tra venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, ecc? . (Sì, lo so, gemo con te.)



6
E non ha un aspetto migliore: 'Distribute' is a now deprecated fork of the 'Setuptools' project.@ PyPI Distribuisci la pagina.
KurzedMetal,

3
@KurzedMetal, secondo la gente di SetupTools, setuptools 0.7 sostituirà sia la distribuzione che i vecchi setuptools ripristinando l'ordine nell'universo. Quindi le cose in realtà miglioreranno considerevolmente!
John McDonnell il

8
La Guida per l'utente del packaging Python conterrà le informazioni più aggiornate sullo stato del packaging Python. È stato notato da Nick Coughlan al PyCon 2013 .
imanuelcostigan,

1
@Flimm L'ultima modifica è passata poco tempo fa. Ormai Bento è maturo?
Martin Thoma,

251

Sono un manutentore di distutils e collaboratore di distutils2 / packaging. Ho parlato della confezione di Python al ConFoo 2011 e in questi giorni ne sto scrivendo una versione estesa. Non è ancora stato pubblicato, quindi ecco alcuni estratti che dovrebbero aiutare a definire le cose.

  • Distutils è lo strumento standard utilizzato per l'imballaggio. Funziona piuttosto bene per esigenze semplici, ma è limitato e non banale da estendere.

  • Setuptools è un progetto nato dal desiderio di riempire la funzionalità distutils mancante ed esplorare nuove direzioni. In alcune sottocomunità, è uno standard di fatto . Usa la magia e il patching delle scimmie che sono disapprovati dagli sviluppatori core di Python.

  • Distribuire è un fork di Setuptools che è stato avviato dagli sviluppatori ritenendo che il suo ritmo di sviluppo fosse troppo lento e che non fosse possibile evolverlo. Il suo sviluppo è stato notevolmente rallentato quando distutils2 è stato avviato dallo stesso gruppo. Aggiornamento 2013-agosto: la distribuzione viene nuovamente riunita in setuptools e interrotta.

  • Distutils2 è una nuova libreria distutils, iniziata come fork della base di codici distutils, con buone idee tratte da strumenti di installazione (di cui alcuni sono stati discussi a fondo nei PEP) e un programma di installazione di base ispirato a pip. Il nome effettivo che usi per importare Distutils2 è packagingnella libreria standard Python 3.3+ o distutils2in 2.4+ e 3.1–3.2. (A breve sarà disponibile un backport.) Distutils2 non ha rilasciato la versione 3.3 di Python ed è stato messo in attesa.

Ulteriori informazioni:

Spero di finire presto la mia guida, conterrà maggiori informazioni sui punti forti e deboli di ogni libreria e una guida alla transizione.


1
No. distutils2 prende alcune buone idee da setuptools / distribut, dopo la standardizzazione (PEP) o no (ad esempio, faccio da mentore a uno studente GSoC che sta aggiungendo un comando di sviluppo e la generazione automatica di script), ma non sarà mai un drop-in sostituzione: ci sono alcune parti che non vogliamo (uova, integrazione VCS, ecc.). OTOH, distutils2 ha alcune cose che setuptools / distribut non hanno. Per facilitare la transizione, penso che gli sviluppatori di distribuzioni forse useranno distutils2 per supportare nuovi standard e strumenti; Penso anche di ricordare lo sviluppatore di setuptools che diceva che voleva supportare nuovi standard.
Éric Araujo,

1
Dove cade ez_setup in tutto questo? Ci sono anche aggiornamenti sullo stato di distutils2?
James McMahon,

2
@ ÉricAraujo Mi dispiace per il ritardo. Spero davvero che sia pronto in tempo per la 3.4! Io amo Python, ma la confezione è sempre mi ha fatto battere la testa contro il muro. (In altre notizie, come sta arrivando la tua guida? Se è finita, potresti collegarla nella tua risposta sopra?)
Zearin

9
@AlexisHuet Questo tipo di commento sarebbe meglio se contenga il link al commento qui sotto (che puoi ottenere dal sharepulsante).
erikbwork,

2
dovresti forse aggiornare la risposta per menzionare che è distributestato recentemente ricomposto setuptools. Il fatto che gran parte delle informazioni là fuori siano obsolete aumenta la confusione
Amro

5

NOTA: Risposta obsoleta, Distribuisci ora obsoleta. Questa risposta non è più valida da quando è stata costituita la Python Packaging Authority e ha fatto molto lavoro per ripulirla.


Sì, ce l'hai. Eeeek !!! Penso che in questo momento il pacchetto preferito sia Distribute , che è un fork di setuptools, che sono un'estensione di distutils (il sistema di packaging originale). Setuptools non veniva mantenuto, quindi è stato biforcato e rinominato, tuttavia quando installato utilizza il nome del pacchetto di setuptools! Penso che la maggior parte degli sviluppatori Python ora usi Distribuisci, e posso dire con certezza che lo faccio.


Per la cronaca, ho accettato questa risposta perché mi ha detto la situazione ora (E la forcella di è l'estensione della relazione che l'immagine nell'altra risposta non menziona). E da qualche parte lungo la strada ho anche imparato che la documentazione stessa non è di solito sicura di cosa stia cercando di dire.
VPeric,

2
@VPeric, In effetti, la documentazione riflette il fatto che questo aspetto di Python è in uno stato di flusso / disordine.
juanchopanza,

2

Mi rendo conto di aver risposto alla tua domanda secondaria senza affrontare ipotesi indiscusse nel tuo problema originale:

Sto provando a eseguire il porting di una libreria open source (SymPy, se qualcuno si sta chiedendo) a Python 3. Per fare questo, ho bisogno di eseguire 2to3 automaticamente quando costruisco per Python 3.

È possibile che non hanno bisogno . Altre strategie sono descritte su http://docs.python.org/dev/howto/pyporting

Per farlo, devo usare distribuire,

È possibile :) distutils conversione 2to3 supporti accumulo di tempo per il codice (non docstring), in un modo diverso che distribuiscono di: http://docs.python.org/dev/howto/pyporting#during-installation


Grazie, anche se abbiamo già deciso di risolvere il problema scrivendo il nostro script per gestire la conversione. E sì, sapevo che c'erano altre opzioni oltre all'utilizzo di 2to3, ma SymPy è una base di codice complessa (circa 200k + righe l'ultima volta che ho controllato) e l'utilizzo di 2to3 era l'unica strategia realistica. Grazie ancora, in ogni caso!
VPeric

2

Aggiornamento di questa domanda alla fine del 2014, dove fortunatamente il caos del packaging di Python è stato notevolmente ripulito dal gestore di pacchetti " conda " di Continuum .

In particolare, conda consente rapidamente la creazione di " ambienti " conda . Puoi configurare i tuoi ambienti con diverse versioni di Python. Per esempio:

conda create -n py34 python=3.4 anaconda

conda create -n py26 python=2.6 anaconda

creerà due ambienti ("py34" o "py26") Python con diverse versioni di Python.

Successivamente è possibile richiamare l'ambiente con la versione specifica di Python con:

source activate <env name>

Questa funzione sembra particolarmente utile nel tuo caso in cui devi gestire diverse versioni di Python.

Inoltre, conda ha le seguenti caratteristiche:

  • Python agnostico
  • Piattaforma incrociata
  • Non sono richiesti privilegi di amministratore
  • Gestione intelligente delle dipendenze (tramite un solutore SAT)
  • Gestisce perfettamente le librerie C, Fortran e di sistema a cui potresti dover fare un collegamento

Quest'ultimo punto è particolarmente importante se ti trovi nell'arena dell'informatica scientifica.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.