Gestione dei parametri a riga di comando.
Quando lanciamo uno script da consolle, potremmo avere la necessita’ di passare allo stesso dei parametri che possano modificarne il comportamento in avvio .
Di solito i parametri vengono definiti da un carattere che identifica il parametro preceduto dal segno ‘–‘, ad esempio -d, seguito eventualmente da un <valore> del parametro ad esempio:
python mioscript.py -d <valore> -a
Vediamo come si gestiscono questi parametri.
A titolo di esempio creiamo uno script che come parametro di ingresso possa indicare se stampare a video il debug oppure no.
Per gestire i parametri in python si può usare una libreria chiamata sys, questo modulo mette a disposizione una lista,la sys.argv che contiene tutti i parametri specificati.
Creiamo un file script chiamato test.py e inseriamo queste righe:
import sys
print(sys.argv)
Ora da riga di comando digitiamo il comando python test.py -d True
a video comparirà il seguente risultato : [‘test.py’,’-d’,’True’]
Come possiamo vedere il contenuto della lista sys.argv contiene alla posizione 0 il nome dello script lanciato e di seguito tutti i parametri inseriti che ora dovremmo solo iterare e usare per dare istruzioni al nostro programma.
Altro metodo – Argparse
Un altro metodo usato quando il numero dei parametri o lo script sono piuttosto complicati, e’ l’uso della libreria ARGPARSE .
Questa libreria offre un metodo molto comodo di gestire i parametri e mette a disposizione la possibilita’ di creare un help. il classico -h / –help per ottenere delle informazioni sul programma e sul modo d’uso dello stesso.
Vediamo subito un esempio di codice :
import argparse
# istanziamo un oggetto di tipo ArgumentParser
parser = argparse.ArgumentParser(description = "Semplice programma per dimostrare argparser", usage="main.py -d -f [nomefile.txt]")
#aggiungiamo gli argomenti
parser.add_argument("-d", "--debug" , default=False ,help="Abilita il debug default off", action="store_true")
parser.add_argument("-f", "--file", type=str,help="specifica il file di debug")
#assegnazione degli argomenti
args = parser.parse_args()
print(f"Debug: {args.debug}\nFile:{args.file}")
Spiegando il codice , tralasciando la prima riga di import, abbiamo il primo comando che crea l’oggetto “parser” di tipo ArgumentParser a cui passiamo i primi parametri che sono description e usage.
Questi due parametri servono per inserire del testo che verra’ stampato a video nel momento in cui chiameremo l’ help da riga di comando eseguendo ad esempio python script.py -h avendo come risultato
daniel@daniel-desktop:~/PYTHON/PARAMETRI$ python3 script.py -h
usage: main.py -d [True/False] -f [nomefile.txt]
Semplice programma per dimostrare argparser
optional arguments:
-h, --help show this help message and exit
-d, --debug Abilita il debug default off
-f FILE, --file FILE specifica il file di debug
Ci sono altri parametri che si possono aggiungere che li possiamo trovare sulla guida uffciale di python a questo link https://docs.python.org/3/library/argparse.html.
proseguendo nello script abbiamo il metodo add_argument, il quale si occupa di aggiungere tutti i parametri al,’oggetto parser . Per ogni parametro dobbiamo specificare il nome del parametro e poi il tipo (intero, float, bool….) , un valore di default nel caso il parametro non venga specificato e il parametro help serve a stampare qualcosa che spieghi cosa serva il parametro nel caso di richiesta di -h/–help.
Se il parametro non prevede specifiche , come ad esempio -d che deve solamente attivare il debug in caso venga richiamato, e’ necessario specificare il parametro action che può assumere i seguenti valori:
store_const : serve a memorizzare il valore costante del parametro, e’ necessario aggiungere anche il parametro const=<valore>. ad esempio :
parser.add_argument(“-n”,”–numero”,action=”store_const”, const=455)
questo memorizzerà il valore 455 nel parametro n anche se non specificato in chiamata
store_true: assegna il valore True all’argomento se richiamato
store_false: assegna il valore false all’argomento se richiamato
Altri valori si possono specificare ma vi rimando sempre alla guida ufficiale per approfondirli.
A questo punto con l’istruzione args = parser.parse_args() assegno i valori al namespace args al quale potremmo accedere con il metodo args.[nome parametro]
seguendo ad esempio il comando con i parametri seguenti python script.py -d -f prova.txt avremmo il seguente risultato
daniel@daniel-desktop:~/PYTHON/PARAMETRI$ python3 script.py -d -f prova.txt
Debug: True
File:prova.txt
daniel@daniel-desktop:~/PYTHON/PARAMETRI$