setuptools vs. distutils: perché distutils è ancora una cosa?


143

Python ha una storia di confusione di strumenti che possono essere utilizzati per strutturare e descrivere i progetti: questi includono distutilsnella libreria standard, distribute, distutils2, e setuptools(e forse più). Sembra che distributee distutils2sono stati sospesi a favore setuptools, che lascia due standard in competizione.

Per quanto ne so, setuptoolsoffre molte più opzioni (ad es. Dichiarazione di dipendenze, test, ecc.) Rispetto a distutils, tuttavia non è incluso nella libreria standard di Python (ancora?).

La Guida per l'utente di Python Packaging [ 1 ] consiglia ora:

Utilizzare setuptoolsper definire progetti e creare distribuzioni di origine.

E spiega:

Sebbene sia possibile utilizzare puro distutilsper molti progetti, non supporta la definizione di dipendenze da altri progetti e mancano diverse utilità utili per popolare automaticamente i metadati dei pacchetti forniti da setuptools. Essendo al di fuori della libreria standard, setuptools offre anche un set di funzionalità più coerente tra le diverse versioni di Python e (a differenza di distutils), setuptoolsverrà aggiornato per produrre i formati standard "Metadata 2.0" in arrivo su tutte le versioni supportate.

Anche per i progetti che scelgono di utilizzare distutils, quando pip installa tali progetti direttamente dal sorgente (anziché installare da un file di ruote precompilato), in realtà costruirà il tuo progetto usando setuptoolsinvece.

Tuttavia, esaminare i vari file setup.py del progetto rivela che questo non sembra essere uno standard reale. Molti pacchetti continuano a essere utilizzati distutilse quelli che supportano setuptoolsspesso si mescolano setuptoolsad distutilsesempio eseguendo un'importazione fallback:

try:
    from setuptools import setup
except ImportError:
    from distutils.core import setup

Seguito da un tentativo di trovare un modo per scrivere un'installazione che può essere installata da entrambi setuptoolse distutils. Ciò include spesso vari modi di controllo della dipendenza soggetto a errori, poiché distutilsnon supporta le dipendenze nella funzione di installazione.

Perché le persone continuano a fare lo sforzo extra per supportare distutils- il fatto che setuptoolsnon sia nella libreria standard è l'unica ragione? Quali sono i vantaggi distutilse quali sono gli svantaggi della scrittura di file setup.py che supportano solo setuptools.


4
distutilsè stato riunito insetuptools , ma ci sono app legacy che sono state scritte per l'uso distutilse ci sono costi per migrare verso standard corretti.
metatoaster

3
"Sembra che distribuire e distutils2 siano stati interrotti a favore di setuptools", giusto, distribuire è solo un wrapper per setuptools ora, e distutils2 è morto.
kay - SE è malvagio il

1
setuptoolsè un'alternativa migliorata, distutilsma si noti che " Il programma di installazione pip raccomandato esegue tutti gli script setup.py con setuptools, anche se lo script stesso importa solodistutils " ( fonte )
user2314737

Risposte:


77

Dai un'occhiata a questa domanda SO. Spiega molto bene tutti i metodi di imballaggio e potrebbe aiutare a rispondere in qualche modo alla tua domanda: Differenze tra distribuzione, distutils, setuptools e distutils2?

Distutils è ancora lo strumento standard per il packaging in Python. È incluso nella libreria standard (Python 2 e Python da 3.0 a 3.3). È utile per le semplici distribuzioni Python, ma manca di funzionalità. Presenta il pacchetto distutils Python che può essere importato nello script setup.py.

Setuptools è stato sviluppato per superare i limiti di Distutils e non è incluso nella libreria standard. Ha introdotto un'utilità della riga di comando chiamata easy_install. Ha inoltre introdotto il pacchetto Python setuptools che può essere importato nello script setup.py e il pacchetto Python pkg_resources che può essere importato nel codice per individuare i file di dati installati con una distribuzione. Uno dei suoi trucchi è che corregge le scimmie dal pacchetto distyth di Python. Dovrebbe funzionare bene con pip. L'ultima versione è stata rilasciata a luglio 2013.

Quindi, come puoi vedere setuptools dovrebbe essere preferito ai distutils, e vedo da dove viene la tua domanda, tuttavia non vedo distutils perdere supporto in qualunque momento presto, come, in poche parole, è usato in molti casi con alcuni programmi legacy popolari . E come probabilmente saprai cambiare questo genere di cose nei programmi legacy può essere una vera seccatura e presentare alcuni problemi, ad esempio incompatibilità, che porterebbero lo sviluppatore a dover riscrivere il codice sorgente. Quindi c'è quello, e anche il fatto che distutils è una parte della libreria standard di Python mentre setuptools non lo è. Quindi, se stai creando un programma Python, al giorno d'oggi, usa setuptools, tuttavia tieni presente che senza distutils, setuptools non sarebbe mai esistito.


3
"Distutils è ancora lo strumento standard per il packaging in Python." contraddice la Guida per l'utente di Python Packaging.
cel

1
Non ci credo, dice esplicitamente che setuptools è lo standard. Si noti inoltre che quella frase è stata citata dal sito Web che ho fornito, quindi quelle non sono le mie parole. Tuttavia è un'opinione con cui, tra le altre persone, sono d'accordo.

Ti ho assegnato la generosità poiché la comunità sembra essere d'accordo con te. Sfortunatamente questa domanda non ha ricevuto tutta l'attenzione che avrei desiderato.
cel

easy_install è il motivo principale per cui ho rifiutato setuptools: per me è stata un'enorme fonte di problemi nei pacchetti che lo utilizzano (più semplice da reimballare). Altre caratteristiche sono ok.
Stuart Gathman,

14

è il fatto che setuptools non è nella libreria standard l'unico motivo

Questa è una ragione. Quanto segue è direttamente da NumPysetup.py :

if len(sys.argv) >= 2 and ('--help' in sys.argv[1:] or
        sys.argv[1] in ('--help-commands', 'egg_info', '--version',
                        'clean')):
    # Use setuptools for these commands (they don't work well or at all
    # with distutils).  For normal builds use distutils.
    try:
        from setuptools import setup
    except ImportError:
        from distutils.core import setup

Quindi NumPy preferisce setuptoolsse riesce a trovarlo. Ma poi SciPy lo faceva, fino a quando non è stato patchato per preferire distutilsin alcune situazioni. Citando il registro di commit:

Setuptools sets mode +x on the test scripts, so that Nose refuses to run
them. Better not do that.

Naturalmente, una fusione tra setuptoolse distributedovrebbe risolvere tutto ciò a tempo debito, ma molti pacchetti devono ancora supportare le installazioni di Python 2.6.


1
distributeera un fork di setuptoolsed è ora fuso di nuovo.
R4444

10

Ci sono diverse ragioni di cui ancora parliamo e utilizziamo distutils, anche se setuptools è senza dubbio il miglior set di strumenti.

Innanzitutto, distutils è disponibile ovunque. Se stai cercando di costruire un modulo da condividere con altri e non hai requisiti complicati, è garantito che sia disponibile sulla tua macchina da lavoro. Ciò è particolarmente importante se devi supportare versioni precedenti di Python o se ti trovi a lavorare in un ambiente sconosciuto.

In secondo luogo, setuptools fornisce miglioramenti ai distutils. È quindi modellato sul set di strumenti distutils e da lì prende tutta la sua struttura. La documentazione per setuptools presuppone che il lettore abbia familiarità con distutils e documenta solo come migliora il set di strumenti di base. Puoi pensarci che distutils definisce il dialetto e setuptools migliora quel dialetto.

Il mio approccio personale per i nuovi progetti è partire dal presupposto che userò distutils. Solo man mano che il progetto cresce per richiedere una funzionalità di setuptools faccio l'aggiornamento. Setuptools è un rimpiazzo sostitutivo per distutils, è una modifica di una riga a mio setup.py.


Grazie per la tua risposta. Penso che l'argomento della disponibilità non possa essere così importante, poiché l'installazione di setuptools può essere avviata. Vedo che se distutils fornisce abbastanza funzionalità, ha senso usarlo. Ma mescolare distutils e setuptools secondo me non è un modo molto pulito per raggiungere i propri obiettivi. Tuttavia, @larsmans ha mostrato nella sua risposta alcune difficoltà con setuptools che costringono a usare distutils per alcuni compiti.
cel

9

Fondamentalmente, è dovuto alla divisione delle responsabilità.

setuptoolsnon fa parte della libreria standard di Python perché è gestita da una terza parte anziché dal core team di Python. Il che significa, tra le altre cose:

  • non è coperto dalla suite di test di base e non è invocato dalla funzionalità di base
  • non stabilisce di per sé gli standard di base per i moduli aggiuntivi (posizione, mezzi di importazione, interfaccia binaria delle estensioni C, ecc.).
  • viene aggiornato e rilasciato indipendentemente dalle versioni di Python

In effetti, il core team ha ristretto il campo di applicazione di distutils , riservando loro le parti "standard di base" e "raccolta minima necessaria", lasciando tutto il resto (compilatore esteso / formato del pacchetto / qualunque supporto) a terze parti. Il codice che in precedenza riguardava quelle "parti estese" è stato lasciato obsoleto per compatibilità con le versioni precedenti.

Dalla distribuzione dei moduli Python - Documentazione Python 2.7.12 :

Mentre l'uso diretto di distutilsviene gradualmente eliminato, ha comunque gettato le basi per l'attuale infrastruttura di packaging e distribuzione e non solo rimane parte della libreria standard, ma il suo nome sopravvive in altri modi (come il nome della mailing list utilizzato per coordinare lo sviluppo degli standard di packaging Python).

È inoltre probabile che vengano forniti pacchetti per altri sistemi operativi setuptoolse pipseparatamente - per i motivi di cui sopra

  • e perché non sono necessari - o addirittura dannosi per la manutenibilità - quando esiste già un altro gestore di pacchetti sul sistema.
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.