Esiste un modo per convincere i getopt di pitone per gestire i parametri opzionali per le opzioni?

StackOverflow https://stackoverflow.com/questions/1532737

  •  20-09-2019
  •  | 
  •  

Domanda

Secondo la documentazione sul getopt di pitone (credo) i campi opzioni dovrebbero comportarsi come la funzione getopt(). Tuttavia non riesco a consentire parametri opzionali per il mio codice:

#!/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
È stato utile?

Soluzione

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

$ ./testopt.py --verbose=

che si tradurrà in valore stringa vuota.

Si potrebbe trovare argparse modulo di essere più flessibili.

Altri suggerimenti

Purtroppo, non c'è modo. Dal optparse docs :

  

In genere, una data opzione o prende un argomento o non è così. Un sacco di gente vuole una caratteristica “gli argomenti delle opzioni facoltative”, il che significa che alcune opzioni avranno un argomento se lo vedono, e non saranno, se non lo fanno. Questo è un po 'controverso, perché rende l'analisi ambigua: se "-a" prende un argomento opzionale e "-b" è un'altra opzione del tutto, come possiamo interpretare "-ab"? A causa di questa ambiguità, optparse non supporta questa funzione.

EDIT:. ops, cioè per il modulo di non optparse il modulo getopt, ma il ragionamento perché né modulo ha "argomenti opzionali facoltativi" è lo stesso per entrambi

Si può fare un parametro opzionale con getopt in questo modo:

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"

Utilizzo:

$ python scratch.py --env=prod
production

$ python scratch.py --env=dev
sandbox

$ python scratch.py
sandbox

Se si utilizza la versione 2.3 o successiva, è consiglia di provare il optparse modulo, invece, in quanto è "più conveniente, flessibile e potente ...", così come più recente. Ahimè, come rispose Pynt, non sembra possibile ottenere esattamente quello che vuoi.

getopt di pitone in realtà dovrebbe sostenere args opzionali, come GNU getopt richiedendo '=' essere utilizzato quando si specifica un parametro. Ora è possibile simulare abbastanza facilmente, però, con questo vincolo implicitamente cambiando --opzione a --opzione =

vale a dire. è 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top