2009-10-07 6 views
6

Nach der Dokumentation über Python getopt (glaube ich) sollten die Optionen Felder wie die getopt() Funktion verhalten. Allerdings kann ich nicht scheinen, optionale Parameter zu meinem Code zu aktivieren:Gibt es sowieso, um pythons getopt zu überzeugen, optionale Parameter zu Optionen zu behandeln?

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

Ergebnisse in:

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

Antwort

8

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

$ ./testopt.py --verbose= 

was zu einem leeren String-Wert führt.

Sie könnten argparse Modul flexibler finden.

5

Leider gibt es keinen Weg. Von der optparse docs:

In der Regel eine gegebene Option entweder ein Argument oder nicht. Viele Leute wollen eine "optionale Option Argumente" -Funktion, was bedeutet, dass einige Optionen ein Argument nehmen, wenn sie es sehen, und nicht, wenn sie es nicht tun. Dies ist etwas umstritten, weil es das Parsing mehrdeutig macht: Wenn "-a" ein optionales Argument und "-b" eine andere Option ist, wie interpretieren wir "-ab"? Wegen dieser Mehrdeutigkeit unterstützt optparse diese Funktion nicht.

EDIT: oops, das ist für das optparse Modul nicht das getopt Modul, aber die Begründung, warum weder Modul „optional Option Argumente“ ist für beide gleich ist.

+0

die optparse docs ist;) – SilentGhost

+0

Ja, ich habe gerade bemerkt, dass, klassischer Fall von „falschen Tab "Syndrom. Dennoch denke ich, dass diese Argumentation auch für getopt relativ ist. –

+0

Auch lange Optionen können optionale Argumente eindeutig haben; "--foo" vs. "--foo = arg". Python scheint dies nicht zu unterstützen, was sehr schlecht ist; ein Symptom der halben Neuimplementierung von etwas von Grund auf ... –

0

Wenn Sie Version 2.3 oder höher verwenden, können Sie stattdessen das Modul optparse ausprobieren, da es "bequemer, flexibler und leistungsfähiger ..." ist, sowie neuer. Leider, wie Pynt antwortete, scheint es nicht möglich zu sein, genau das zu bekommen, was du willst.

+0

außer von 'optparser' docs wurde von Pynt vor 45 Minuten gepostet! – SilentGhost

+0

@SilentGhost: Wenn ich Pynts Antwort gelesen habe, sehe ich nichts, das optparse über get_opt empfiehlt, und das ist es, worauf ich hinauswollte. Zugegeben, das habe ich ursprünglich nicht gut erklärt, habe es aber editiert. – PTBNL

+0

optparse sagt ausdrücklich, dass es optionale Optionen nicht unterstützt. – stsquad

2

Sie können einen optionalen Parameter mit getopt wie folgt tun:

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" 

Verbrauch:

$ python scratch.py --env=prod 
production 

$ python scratch.py --env=dev 
sandbox 

$ python scratch.py 
sandbox 
0

Python getopt wirklich optional args unterstützen sollte, wie GNU getopt durch die Forderung '=' verwendet werden wenn ein Parameter angegeben wird. Jetzt können Sie es jedoch sehr einfach simulieren, mit dieser Einschränkung durch implizit ändern --option zu --option =

I.E. Sie können das --option angeben ein Argument erfordert, und dann --option anpassen, um --option = wie folgt:

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