---------- Messaggio inoltrato ---------- > From: Valerio Pachera <siri...@gmail.com> > To: lista python <python@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@host $* python2 tuo_script.py Usage: python2 tuo_script.py (guest|host) (shutdown|reboot) <nomehost> python2 tuo_script.py guest rename <nomehost> <nuovonome> *user@host $* python2 tuo_script.py guest rename foo bar {'<nomehost>': 'foo', '<nuovonome>': 'bar', 'guest': True, 'host': False, 'reboot': False, 'rename': True, 'shutdown': False} -- Nadir
_______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python