---------- Messaggio inoltrato ----------<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

From: Valerio Pachera <<a href="mailto:sirio81@gmail.com" target="_blank">sirio81@gmail.com</a>><br>To: lista python <<a href="mailto:python@lists.python.it" target="_blank">python@lists.python.it</a>><br>Cc: <br>

Date: Sat, 6 Apr 2013 12:10:30 +0200<br>Subject: [Python] command line parsing<br><div dir="ltr"><div><div><div><div><div><div><div><div><div><div>Ciao a tutti, sto creando una spece di cli per amministrare delle macchine virtuali.<br>

</div>Quello che mi preme è tenere una sintassi semplice semplice e rigida.<br><br></div>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.<br>

<br></div>La sintassi della cli NON prevede trattini ( - ).<br></div>Il comando sarebbe logicamente diviso in sottocomandi (subparser potrebbe essere utile).<br><br></div>cli.py guest shutdown <nomehost><br></div>cli.py host shutdown <nomehost><br>

<br></div>Per il "sottocomando" 'guest' sono previste varie opzioni, alcune che possono essere comuni con il sottocomando 'host', come nell'esempio.<br></div><br></div>Cosa ne pensate?<br><br>

</div>Alla fine della fiera 'guest' e 'shutdown' insieme identificano la funzione che andrò a richiamare che avrà come argomento <nomehost>.<br><div><br></div></div></blockquote><div><br></div><div>
Ciao Valerio,</div>
<div>una libreria che a me ha semplificato la vita è <a href="http://docopt.org/" target="_blank">docopt</a>.</div><div>Se sei pratico dello standard POSIX per i messaggi di help (quelli che vengono stampati quando chiami un programma con <font face="courier new, monospace">-h</font> o <font face="courier new, monospace">--help</font>) sei a posto. Altrimenti, sul sito di docopt, il funzionamento è spiegato piuttosto chiaramente.</div>

<div><br></div><div>La cosa bella di <font face="courier new, monospace"><b>docopt</b></font> (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 <font face="courier new, monospace">False</font>, non a <font face="courier new, monospace">None</font>).</div>

<div><br></div><div>Ad esempio il seguente codice:</div><div><br></div><div><div><font face="courier new, monospace">    import docopt</font></div><div><font face="courier new, monospace">    </font></div><div><span style="font-family:'courier new',monospace">   </span><span style="font-family:'courier new',monospace"> </span><font face="courier new, monospace">usage = """</font></div>

<div><span style="font-family:'courier new',monospace">   </span><span style="font-family:'courier new',monospace"> </span><font face="courier new, monospace">{program_title}</font></div><div><span style="font-family:'courier new',monospace">    </span></div>

<div><span style="font-family:'courier new',monospace">   </span><span style="font-family:'courier new',monospace"> </span><font face="courier new, monospace">Usage:</font></div><div><font face="courier new, monospace">        </font><font face="courier new, monospace">{</font><span style="font-family:'courier new',monospace">launcher</span><font face="courier new, monospace">} [-V] [(guest|host) (shutdown|reboot) <nomehost></font><span style="font-family:'courier new',monospace">]</span></div>

<div><font face="courier new, monospace">        </font><font face="courier new, monospace">{</font><span style="font-family:'courier new',monospace">launcher</span><span style="font-family:'courier new',monospace">} [guest rename <nomehost>]</span></div>

<div><span style="font-family:'courier new',monospace">   </span><span style="font-family:'courier new',monospace"> </span><font face="courier new, monospace">""".format(program_name="Tuo Programma", file_name="</font><span style="font-family:'courier new',monospace">python2 " + </span><span style="font-family:'courier new',monospace">__file__)</span></div>

<div><span style="font-family:'courier new',monospace">    </span></div><div><font face="courier new, monospace">    args = docopt.docopt(usage, argv=sys.argv[1:])</font></div><div><font face="courier new, monospace">    print(args)</font></div>

<div><br></div></div><div>si comporta così:</div><div><br></div><div><div><font face="courier new, monospace">    <b>user@host $</b> python2</font><span style="font-family:'courier new',monospace"> </span><span style="font-family:'courier new',monospace">tuo_script.py</span></div>

<div><span style="font-family:'courier new',monospace">    </span><font face="courier new, monospace">Usage:</font></div><div><span style="font-family:'courier new',monospace">   </span><span style="font-family:'courier new',monospace"> </span><font face="courier new, monospace">    python2 tuo_script.py (guest|host) (shutdown|reboot) <nomehost></font></div>

<div><span style="font-family:'courier new',monospace">   </span><span style="font-family:'courier new',monospace"> </span><font face="courier new, monospace">    </font><span style="font-family:'courier new',monospace">python2</span><span style="font-family:'courier new',monospace"> </span><span style="font-family:'courier new',monospace">tuo_script.py guest rename <nomehost> <nuovonome></span></div>

<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">    </font><span style="font-family:'courier new',monospace"><b>user@host $</b></span><font face="courier new, monospace"> python2</font><span style="font-family:'courier new',monospace"> </span><span style="font-family:'courier new',monospace">tuo_script.py guest rename foo bar</span></div>

<div><font face="courier new, monospace">    {'<nomehost>': 'foo',</font></div><div><span style="font-family:'courier new',monospace">   </span><span style="font-family:'courier new',monospace"> </span><font face="courier new, monospace"> '<nuovonome>': 'bar',</font></div>

<div><span style="font-family:'courier new',monospace">   </span><span style="font-family:'courier new',monospace"> </span><font face="courier new, monospace"> 'guest': True,</font></div><div><span style="font-family:'courier new',monospace">   </span><span style="font-family:'courier new',monospace"> </span><font face="courier new, monospace"> 'host': False,</font></div>

<div><span style="font-family:'courier new',monospace">   </span><span style="font-family:'courier new',monospace"> </span><font face="courier new, monospace"> 'reboot': False,</font></div><div><span style="font-family:'courier new',monospace">   </span><span style="font-family:'courier new',monospace"> </span><font face="courier new, monospace"> 'rename': True,</font></div>

<div><span style="font-family:'courier new',monospace">   </span><span style="font-family:'courier new',monospace"> </span><font face="courier new, monospace"> 'shutdown': False}</font></div></div>

<div><br></div><div>--</div><div>Nadir</div></div></div>