python - translations - setuptools vs. distutils: perché le distutils sono ancora una cosa?




translations of mastering bitcoin (3)

è il fatto che setuptools non è nella libreria standard l'unica ragione

Questa è una delle ragioni. Quanto segue è direttamente da NumPy setup.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 setuptools se riesce a trovarlo. Ma poi SciPy lo faceva, fino a quando non veniva patched per preferire le distutils in alcune situazioni. Citando il log 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 setuptools e distribute dovrebbe risolvere tutto questo a tempo debito, ma molti pacchetti devono ancora supportare le installazioni di Python 2.6.

Python ha una storia confusa di strumenti che possono essere usati per creare pacchetti e descrivere progetti: questi includono distutils nella libreria standard, distribute , distutils2 e setuptools (e forse anche di più). Sembra che distribute e distutils2 stati interrotti a favore di setuptools , che lascia due standard in competizione.

A mio setuptools offre molte più opzioni (es. Dichiarazione di dipendenze, test, ecc.) distutils alle distutils , tuttavia non è incluso nella libreria standard Python (ancora?).

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

Utilizzare setuptools per definire progetti e creare distribuzioni di origine.

E spiega:

Sebbene sia possibile utilizzare distutils pure per molti progetti, non supporta la definizione di dipendenze su altri progetti e mancano diverse utilità di utilità per la compilazione automatica dei metadati del pacchetto 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 (diversamente dalle distutils ), setuptools verrà 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 dall'origine (anziché installarli da un file wheel predefinito), in realtà creerà il progetto usando invece setuptools .

Tuttavia, esaminando i vari file setup.py di un progetto, questo non sembra essere uno standard effettivo. Molti pacchetti usano ancora distutils e quelli che supportano setuptools spesso mescolano setuptools con distutils ad esempio eseguendo un'importazione di fallback:

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

Seguito da un tentativo di trovare un modo per scrivere una configurazione che può essere installata da setuptools e distutils . Questo spesso include vari metodi di controllo delle dipendenze soggetti a errori, poiché distutils non supporta le dipendenze nella funzione di installazione.

Perché le persone continuano a fare lo sforzo in più per supportare le distutils - il fatto che setuptools non sia nella libreria standard è l'unica ragione? Quali sono i vantaggi delle distutils e ci sono degli svantaggi nella scrittura dei file setup.py che supportano solo setuptools .


Ci sono diversi motivi per cui parliamo ancora e usiamo le distutils, anche se setuptools è senza dubbio il set di strumenti migliore.

Innanzitutto, le distutils sono disponibili ovunque. Se stai cercando di creare un modulo per la condivisione con altri e non hai requisiti complicati, è garantito che sia disponibile sulla tua macchina da lavoro. Questo è particolarmente importante se devi supportare versioni precedenti di python, o se ti trovi a lavorare in un ambiente non familiare.

In secondo luogo, setuptools fornisce miglioramenti alle distutils. È quindi modellato sullo strumento di distutils e prende tutta la sua struttura da lì. La documentazione per setuptools presuppone che il lettore abbia dimestichezza con le distutils e documenti solo come migliora il set di strumenti di base. Puoi pensare che le distutils definiscono il dialetto e setuptools migliora quel dialetto.

Il mio approccio personale per i nuovi progetti inizia con l'ipotesi che userò le distutils. Solo quando il progetto cresce per richiedere una funzionalità di setuptools, eseguo l'aggiornamento. Il setuptools è una sostituzione drop-in per le distutils, è una modifica di una riga al mio setup.py.


Fondamentalmente, è dovuto alla divisione delle responsabilità.

setuptools non fa parte della libreria standard di Python perché è gestito da una terza parte piuttosto che dal core team di Python. Il che significa, tra le altre cose:

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

In effetti, il core team ha ristretto l'ambito delle distutils , riservando le parti "core standard" e "minimal minimum compilation" per se stesse lasciando al di là di tutto ciò (compilatore / formato esteso del pacchetto / qualsiasi supporto) a terze parti. Il codice che in precedenza copriva quelle "parti estese" è rimasto inalterato per la retrocompatibilità.

Dalla distribuzione dei moduli Python - Documentazione Python 2.7.12 :

Mentre l'uso diretto di distutils è stato gradualmente eliminato, ha 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 del mailing elenco usato per coordinare lo sviluppo degli standard di packaging Python).

Allo stesso modo, i pacchetti per altri sistemi operativi sono in grado di fornire setuptools e pip separatamente, per i motivi sopra citati

  • e perché non sono necessari - o sono addirittura dannosi per la manutenibilità - quando c'è già un altro gestore di pacchetti nel sistema.




distutils