Gibt es ohnehin, um Pythons GetOpt zu überzeugen, optionale Parameter für Optionen zu verarbeiten?

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

  •  20-09-2019
  •  | 
  •  

Frage

Nach der Dokumentation zu Python's getopt (Ich denke) Die Optionsfelder sollten sich wie die verhalten getopt() Funktion. Ich kann jedoch nicht anscheinend optionale Parameter für meinen Code aktivieren:

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

Führt zu:

$ ./testopt.py -v
option -v requires argument
$ ./testopt.py -v 1
verbosity is 1
War es hilfreich?

Lösung

getopt unterstützt optionale Parameter nicht. Im Falle einer langen Option könnten Sie dies tun:

$ ./testopt.py --verbose=

Dies führt zu einem Wert von leerem Saiten.

Sie könnten finden argparse Modul, um flexibler zu sein.

Andere Tipps

Leider gibt es keinen Weg. Von dem Optparse Docs:

In der Regel nimmt eine bestimmte Option entweder ein Argument an oder nicht. Viele Menschen möchten eine Funktion "Optional Option Argumente", was bedeutet, dass einige Optionen ein Argument aufnehmen, wenn sie es sehen, und nicht, wenn sie es nicht tun. Dies ist etwas umstritten, da es das Parsen mehrdeutig macht: Wenn "-a" ein optionales Argument nimmt und "-b" ist eine andere Option, wie wir "-ab" interpretieren? Aufgrund dieser Mehrdeutigkeit unterstützt OptParse diese Funktion nicht.

BEARBEITEN: oops, das ist für das OptParse -Modul nicht das GetOPT -Modul, aber die Argumentation, warum kein Modul "optionale Option Argumente" enthält, ist für beide gleich.

Sie können einen optionalen Parameter mit GetOpt wie folgt durchführen:

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"

Verwendungszweck:

$ python scratch.py --env=prod
production

$ python scratch.py --env=dev
sandbox

$ python scratch.py
sandbox

Wenn Sie Version 2.3 oder später verwenden, möchten Sie möglicherweise die ausprobieren Optparse Modul stattdessen, da es "bequemer, flexibler und leistungsfähiger ..." und neuer ist. Leider scheint es nicht möglich, genau das zu bekommen, was Sie wollen.

Pythons GetOpt sollte optionale Argumente wirklich unterstützen, wie GNU GetOpt, indem er bei der Angabe eines Parameters verwendet werden muss. Jetzt können Sie es jedoch ganz einfach simulieren, indem Sie diese Einschränkung durch implizit geändert -option zu --option =

Dh Sie können angeben, dass die Option ein Argument erfordert, und dann anpassen -option an --option = wie folgt:

for i, opt in enumerate(sys.argv):
    if opt == '--option':
        sys.argv[i] = '--option='
    elif opt == '--':
        break
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top