Y at-il de toute façon de persuader le getopt de Python pour gérer les paramètres facultatifs à options?

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

  •  20-09-2019
  •  | 
  •  

Question

Selon la documentation sur getopt de python (je pense) les champs d'options devraient se comporter comme la fonction getopt(). Cependant, je ne peux pas sembler activer les paramètres facultatifs se rapportant à mon code:

#!/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)

Résultats dans:

$ ./testopt.py -v
option -v requires argument
$ ./testopt.py -v 1
verbosity is 1
Était-ce utile?

La solution

getopt ne prend pas en charge les paramètres facultatifs. en cas de longue option vous pouvez faire:

$ ./testopt.py --verbose=

qui se traduira par la valeur chaîne vide.

Vous pouvez trouver argparse module plus flexible.

Autres conseils

Malheureusement, il n'y a aucun moyen. De optparse docs :

  

En règle générale, une option donnée soit prend un argument ou non. Beaucoup de gens veulent une fonctionnalité « option en option d'arguments », ce qui signifie que certaines options prendront un argument s'ils le voient, et ils ne se font pas. Ceci est quelque peu controversée, car elle rend l'analyse ambiguë: si « -a » prend un argument optionnel et « -b » est une autre option tout à fait, comment interprétez-nous « -AB »? En raison de cette ambiguïté, optparse ne supporte pas cette fonction.

EDIT:. oops, qui est pour le module optparse pas le module getopt, mais le raisonnement pourquoi ni module a "arguments d'option en option" est le même pour les deux

Vous pouvez faire un paramètre optionnel avec getopt comme ceci:

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"

Utilisation:

$ python scratch.py --env=prod
production

$ python scratch.py --env=dev
sandbox

$ python scratch.py
sandbox

Si vous utilisez la version 2.3 ou ultérieure, vous pouvez essayer le optparse module au lieu, car il est « plus pratique, flexible et puissant ... », ainsi que la plus récente. Hélas, comme Pynt a répondu, il ne semble pas possible d'obtenir exactement ce que vous voulez.

Le Getopt python devrait vraiment soutenir args en option, comme GNU getopt en exigeant '=' être utilisé lors de la spécification d'un paramètre. Maintenant, vous pouvez simuler assez facilement si, avec cette contrainte en changeant implicitement --option à --option =

i.e.. vous pouvez spécifier que --option nécessite un argument, puis réglez --option à --option = comme suit:

for i, opt in enumerate(sys.argv):
    if opt == '--option':
        sys.argv[i] = '--option='
    elif opt == '--':
        break
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top