2009-10-07 11 views
6

Secondo la documentazione su Python getopt (credo) i campi delle opzioni dovrebbero comportarsi come la funzione getopt(). Tuttavia non riesco a consentire parametri opzionali per il mio codice:Esiste comunque la possibilità di convincere Python a getopt a gestire i parametri opzionali alle opzioni?

#!/usr/bin/python 
import sys,getopt 

if __name__ == "__main__": 
    try: 
     opts, args = getopt.gnu_getopt(sys.argv[1:], "v::", ["verbose="]) 
    except getopt.GetoptError, err: 
     print str(err) 
     sys.exit(1) 

    for o,a in opts: 
     if o in ("-v", "--verbose"): 
      if a: 
       verbose=int(a) 
      else: 
       verbose=1 
      print "verbosity is %d" % (verbose) 

Risultati in:

$ ./testopt.py -v 
option -v requires argument 
$ ./testopt.py -v 1 
verbosity is 1 

risposta

8

getopt non supporta parametri opzionali. in caso di opzione di tempo si potrebbe fare:

$ ./testopt.py --verbose= 

che si tradurrà in valore vuoto-string.

È possibile trovare il modulo argparse più flessibile.

5

Sfortunatamente, non c'è modo. Da optparse docs:

In genere, una determinata opzione accetta un argomento o non lo fa. Un sacco di persone desidera una funzione "opzioni opzionali", il che significa che alcune opzioni prenderanno un argomento se lo vedranno, e non lo faranno se non lo fanno. Questo è un po 'controverso, perché rende l'analisi ambigua: se "-a" accetta un argomento opzionale e "-b" è completamente un'altra opzione, come interpretiamo "-ab"? A causa di questa ambiguità, optparse non supporta questa funzione.

EDIT: oops, vale a dire per il modulo optparse non il modulo getopt, ma il ragionamento perché né modulo ha "argomenti opzionali facoltativi" è lo stesso per entrambi.

+0

che è docs optparse;) – SilentGhost

+0

Sì ho appena notato che, classico caso di "scheda sbagliata "sindrome. Tuttavia, penso ancora che questo ragionamento sia relativo anche per getopt. –

+0

Inoltre, le opzioni lunghe possono avere argomenti opzionali in modo non ambiguo; "--foo" vs. "--foo = arg". Python non sembra supportare questo, che è molto povero; un sintomo di metà re-implementazione di qualcosa da zero ... –

0

Se si utilizza la versione 2.3 o successiva, si consiglia di provare il modulo optparse invece, poiché è "più conveniente, flessibile e potente ...", nonché più recente. Ahimè, come ha risposto Pynt, non sembra possibile ottenere esattamente quello che vuoi.

+0

eccetto che i documenti di "optparser" sono stati pubblicati da Pynt 45 minuti fa! – SilentGhost

+0

@SilentGhost: nella mia lettura della risposta di Pynt, non vedo nulla che raccomandi optparse a get_opt, che è quello che stavo ottenendo. Certo, non l'ho spiegato bene in origine, ma ho modificato per farlo. – PTBNL

+0

optparse dice esplicitamente che non supporta i parametri opzionali alle opzioni. – stsquad

2

Si può fare un parametro opzionale con getopt come questo:

import getopt 
import sys 

longopts, shortopts = getopt.getopt(sys.argv[1:], shortopts='', longopts=['env=']) 
argDict = dict(longopts) 

if argDict.has_key('--env') and argDict['--env'] == 'prod': 
    print "production" 
else: 
    print "sandbox" 

Usage: getopt

$ python scratch.py --env=prod 
production 

$ python scratch.py --env=dev 
sandbox 

$ python scratch.py 
sandbox 
0

di pitone in realtà dovrebbe sostenere args opzionali, come GNU getopt richiedendo '=' essere usato quando si specifica un parametro. Ora puoi facilmente simularlo, con questo vincolo cambiando implicitamente - opzione su --option =

I.E. è possibile specificare che --opzione richiede un argomento, e quindi regolare --opzione a --opzione = come segue:

for i, opt in enumerate(sys.argv): 
    if opt == '--option': 
     sys.argv[i] = '--option=' 
    elif opt == '--': 
     break 
Problemi correlati