[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