9.46 Creare un nuovo comando Distutils

La sezione descrive i passaggi per creare un nuovo comando Distutils.

Un nuovo comando vive in un modulo nel package distutils.command. C'è un semplice template nella directory chiamata command_template. Si copi questo file in un nuovo modulo con lo stesso nome del nuovo comando che si sta implementando. Questo modulo dovrebbe implementare una classe con lo stesso nome del modulo (e del comando). Così, per esempio, per creare il comando peel_banana (cosicché gli utenti possano eseguire "setup.py peel_banana"), si deve copiare command_template in distutils/command/peel_banana.py, quindi lo si deve editare in modo da implementare la classe peel_banana, una sotto classe di distutils.cmd.Command.

Sottoclassi di Command definiranno i seguenti metodi.

initialize_options()( I)
mposta i valori predefiniti per tutte le opzioni che questo comando supporta. Si noti che questi valori predefiniti potrebbero essere sovrascritti da altri comandi, dallo script di setup, dai file di configurazione o da riga di comando. Comunque, questo non è il posto dove piazzare le dipendenze di codice tra le opzioni; generalmente, l'implementazione initialize_options() è solo un insieme di assegnamenti "self.foo = None ".

finalize_options( )
Imposta il valore finale per tutte le opzioni che questo comando supporta. Questo viene chiamato sempre il più tardi possibile, del tipo dopo che ogni assegnamento di opzione da riga di comando da altri comandi è stata effettuata. Questo è comunque il posto dove codificare le dipendenze dell'opzione; se foo dipende da bar, è quindi sicuro impostare foo da bar sempre che a foo sia stato assegnato lo stesso valore in initialize_options.
run( )
Una 'ragion d'essere' di un comando: eseguire l'azione per il quale esiste, controllato da opzioni inizializzate da initialize_options(), personalizzato da altri comandi, dallo script di setup, dalla riga di comando, da file di configurazione e completato con finalize_options(). Tutti gli output di terminale e le interazioni con il filesystem dovrebbero essere fatte con run().

sub_commands formalizza la notazione di una ``famiglia'' di comandi, per esempio install come padre con sotto comandi install_lib, install_headers, etc.. Il padre di una famiglia di comandi definisce sub_commands come un attributo di classe; è una lista di tuple doppie "(nome comando, predicato)", con command_name una stringa e predicate un metodo non legato, una stringa o None. predicate è un metodo di un comando di base che determina quale tra i corrispondenti comandi è applicabile nella situazione corrente (per esempio install_headers è applicabile solo se ci sono file di intestazioni C da installare). Se predicate ha il valore None, quel comando è sempre applicabile.

sub_commands è solitamente definito alla *fine* di una classe, perché i predicati possono essere metodi non legati, che devono essere già stati definiti. L'esempio canonico è il comando install.

Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.