2011-01-13 9 views
2

Nehmen wir an, ich habe das folgende Skript.Reihenfolge der Befehlszeilenargumente in einem Python-Skript

Dieses Skript findet die größte Datei unter/home und sendet die Ausgabe mit den 10 größten Dateien per E-Mail.

./myscript.py -d /home -e [email protected] -p 10 

Sagen wir, ich es mir eine E-Mail nicht will, entferne ich „-e [email protected]“ Das Skript schlägt fehl, da es „-e“ erwarten anwesend zu sein. Ich gebe die Variablen über sys.arg[0] ... sys.arg[1] und so weiter.

+0

Was ist die Frage? Zeigen Sie uns etwas Code oder etwas, damit wir Ihnen den Fehler zeigen können. –

+0

Werfen Sie einen Blick auf: http://docs.python.org/dev/library/argparse.html –

Antwort

4

Verwenden Sie die Module argparse oder optparse, um Ihre Argumente zu parsen, anstatt sie selbst zu analysieren. Es erlaubt optionale Argumente und Sie können einen Standardwert angeben.

Hier ist ein kleines Beispiel mit optparse:

import optparse 

parser = optparse.OptionParser() 

parser.add_option("-d", "--directory", metavar="DIR", 
    help="Directory to scan for big files") 
parser.add_option("-e", "--email", metavar='EMAIL', 
    help='email to send the list to') 

opts, args = parser.parse_args() 

print 'scanning', opts.directory 

if opts.email is None: 
    print 'not sending the email' 
+0

Und es ist sowieso einfacher. – delnan

+0

Kein Würfel, wir haben Python 2.4 auf den meisten unserer Server. :( – luckytaxi

+0

@luckytaxi: hinzugefügt Beispiel mit optparse, die auf 2.4 enthalten ist – nosklo

1

Für Python-2.4 Ich glaube, dass optparse der empfohlene Weg ist Befehlszeilenargumente zu analysieren. Es ist ziemlich einfach zu benutzen und es ist definitiv besser, die Optionen manuell zu parsen, obwohl es nicht so vielseitig ist wie das neuere argparse Modul, das in Python-2.7 eingeführt wurde.

EDIT:

Hier ist ein (leicht modifiziert) optparse Ausschnitt aus einer meiner Python-Programme:

options = optparse.OptionParser(description = 'Convert Foo to Bar') 

options.add_option('-i', '--input', dest = 'input', action = 'store', default = '-') 
options.add_option('-j', '--json', dest = 'json', action = 'store_true', default = False) 
options.add_option('-m', '--mongodb', dest = 'mongodb', action = 'store', default = None) 
options.add_option('-o', '--output', dest = 'output', action = 'store', default = '-') 

(options, argv) = options.parse_args(sys.argv) 

if options.json: 
    print "output: " + options.output 
3

Statt direkt Argumente auf Variablen über sys.arg zuweisen, warum Sie nicht versuchen, mit die getopt oder argparse Module? Es ist viel einfacher und flexibler, dies zu tun. Hier ist ein Beispiel unter Verwendung von argparse (aus der Dokumentation von Python 2.7):

import argparse 

parser = argparse.ArgumentParser(description='Sum or find the max of some integers.') 
parser.add_argument('integers', metavar='N', type=int, nargs='+', 
        help='just an integer') 
parser.add_argument('--sum', dest='accumulate', action='store_const', 
        const=sum, default=max, 
        help='sum command line arguments [default action is to find the maximum]') 

args = parser.parse_args() # Simple enough, right? 
print args.accumulate(args.integers) 

die Sie verwenden können (nennen wir es args.py):

# ./args.py 1 2 3 4 
4 

# ./args.py 1 2 3 4 --sum 
10 

ich sogar die Reihenfolge der Integer-Argumente geändert und die --sum und es schien nicht viel ausmacht!

Alternativ mit getopt:

import getopt, sys 

def main(): 
    try: 
     opts, args = getopt.getopt(sys.argv[1:], "hm:v", ["help", "message="]) 
    except getopt.GetoptError, err: 
     print str(err) # will print an error about option not recognized.. 
     # maybe you should print something informative about correct usage here. 
     sys.exit(1) 
    # Default option values 
    message = None 
    verbose = False 
    # Process cmd line options 
    for o, a in opts: 
     if o == "-v": 
      verbose = True 
     elif o in ("-h", "--help"): 
      usage() 
      sys.exit(2) 
     elif o in ("-m", "--message"): 
      message = a 
     else: 
      assert False, "unhandled option!" 
    ''' 
    Do whatever you wish.. 
    ''' 

if __name__ == "__main__": 
    main() 
+0

+1 für mich eine bessere Art zu definieren 'main()' – luckytaxi