[Python] command line parsing
Nadir Sampaoli
nadirsampaoli a gmail.com
Dom 7 Apr 2013 16:36:35 CEST
---------- Messaggio inoltrato ----------
> From: Valerio Pachera <sirio81 at gmail.com>
> To: lista python <python at lists.python.it>
> Cc:
> Date: Sat, 6 Apr 2013 12:10:30 +0200
> Subject: [Python] command line parsing
> Ciao a tutti, sto creando una spece di cli per amministrare delle macchine
> virtuali.
> Quello che mi preme è tenere una sintassi semplice semplice e rigida.
>
> Ho letto un po' di documentazione su argparse ma faccio fatica a capire se
> fa al caso mio o è meglio che mi scriva un semplice parser.
>
> La sintassi della cli NON prevede trattini ( - ).
> Il comando sarebbe logicamente diviso in sottocomandi (subparser potrebbe
> essere utile).
>
> cli.py guest shutdown <nomehost>
> cli.py host shutdown <nomehost>
>
> Per il "sottocomando" 'guest' sono previste varie opzioni, alcune che
> possono essere comuni con il sottocomando 'host', come nell'esempio.
>
> Cosa ne pensate?
>
> Alla fine della fiera 'guest' e 'shutdown' insieme identificano la
> funzione che andrò a richiamare che avrà come argomento <nomehost>.
>
>
Ciao Valerio,
una libreria che a me ha semplificato la vita è docopt <http://docopt.org/>.
Se sei pratico dello standard POSIX per i messaggi di help (quelli che
vengono stampati quando chiami un programma con -h o --help) sei a posto.
Altrimenti, sul sito di docopt, il funzionamento è spiegato piuttosto
chiaramente.
La cosa bella di *docopt* (oltre all'idea, abbastanza geniale, che lo
configuri con un help message che è definito da uno standard) è che ti
restituisce una hashmap completa delle opzioni (inclusi valori di default
che possono essere o quelli automatici o specificati da te), e distingue, a
seconda del tipo degli argument, booleani e stringhe (ossia, un argument
che non richiede assegnamento di valori va di default a False, non a None).
Ad esempio il seguente codice:
import docopt
usage = """
{program_title}
Usage:
{launcher} [-V] [(guest|host) (shutdown|reboot) <nomehost>]
{launcher} [guest rename <nomehost>]
""".format(program_name="Tuo Programma", file_name="python2 " +
__file__)
args = docopt.docopt(usage, argv=sys.argv[1:])
print(args)
si comporta così:
*user at host $* python2 tuo_script.py
Usage:
python2 tuo_script.py (guest|host) (shutdown|reboot) <nomehost>
python2 tuo_script.py guest rename <nomehost> <nuovonome>
*user at host $* python2 tuo_script.py guest rename foo bar
{'<nomehost>': 'foo',
'<nuovonome>': 'bar',
'guest': True,
'host': False,
'reboot': False,
'rename': True,
'shutdown': False}
--
Nadir
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.python.it/pipermail/python/attachments/20130407/5f70d091/attachment.html>
Maggiori informazioni sulla lista
Python