getopt command Line input

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Karpfen
User
Beiträge: 5
Registriert: Mittwoch 4. März 2015, 08:57

Hallo

irgendwie hab ich hier einen Logic bug
Ich möchte von der Comandline 5-6 Werte einlesen. Sobald aber die Option -x gesetzt wird sollen die Werte manuell gesetzt werden. Solange -x nicht angegeben wird soll das Programm die angegebenen Werte importieren.


Ihrgend Wie sehe ich gerade den Baum vor lauter Bäumen nicht mehr :-( oder kann ich aus dieser Schleife eventuell mit einem goto aussteigen?

Code: Alles auswählen

def main(argv):
   Processor = ''
   input = ''
   output = ''
   Name = ''
   
   try:
      opts, args = getopt.getopt(argv,"xh:p:y:o:n:",["proc=","ifile=","ofile=","name="])
   except getopt.GetoptError:
      print 'test_.py (-x) -p <processor> -y <input> -0 <output> -n <pname>'
  
   for opt, arg in opts:
      if opt == '-x':
         processor = Name
         id = '08150815' 
         if opt in ("-p", "--ppath"):
            Processor = arg
         elif opt in ("-o", "--ofile"):
            output = arg
         elif opt in ("-n", "--pname"):
            Name = arg 
      else opt == '-h':
         print 'test_.py (-x) -p <processor> -y <input> -0 <output> -n <pname>'
         sys.exit()
      elif opt in ("-p", "--ppath"):
         Processor = arg
      elif opt in ("-y", "--yfile"):
         input = arg
      elif opt in ("-o", "--ofile"):
         output = arg
      elif opt in ("-n", "--pname"):
         Name = arg 

   print 'Processor :', Processor
   print 'Input File :', yamlfile
   print 'Output File :', output_path
   print 'Name :', Name_Prozessor

oder gibt es hier zu einen schönere Methode ?

Vielen Dank im Vorraus
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Karpfen: die schönere Möglichkeit wäre es, argparse zu verwenden. Die Dokumentation hat sehr gute Beispiele.
Karpfen
User
Beiträge: 5
Registriert: Mittwoch 4. März 2015, 08:57

So nun habe ich mich mal etwas mit dem argparse package beschäftigt:

nun habe ich allerdings immer noch ein Problem

wenn ich die Option 1 oder 2 Wähle scheint alles was mit argparse zu tun hat zu funktionieren allerdings übergitb das Tool diese args.xxxxxx Parameter nicht an die variable woran kann das liegen ?

Code: Alles auswählen

import argparse

parser = argparse.ArgumentParser(description='test_aufruf.py  -x <option> -p <processor> -y <yamlfile> -0 <output> -n < name>')

parser.add_argument("-x", "--option", dest="option", help = "1 oder 2", metavar = "Option")
parser.add_argument("-p", "--processor", dest="processor", help = "Angeben der Processor ", metavar = "Processor")
parser.add_argument("-o", "--output", dest="output_path", help = " output  angeben", metavar= "Output")
parser.add_argument("-y", "--yaml", dest="input", help = " input file angeben", metavar= "Input")
parser.add_argument("-n", "--name", dest="Name", help = " Name angeben", metavar= "Name")

args = parser.parse_args()
option=args.option
print option

if option == 1:
   processor = args.Processor
   yamlfile = args.input
   output_path = args.output
   Name_Prozessor = args.Name
elif option == 2:
   processor = args.Processor
   output_path = args.output
   Name_Processor = args.Name
   
print processor
print input
print output
print Name
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Karpfen: args.option ist bei Dir ein String, Du mußt also type=int angeben, damit argparse das Argument in eine Zahl umwandelt. Denn Sinn von Option habe ich allerdings noch nicht verstanden.
Wenn etwas in allen if-Zeigen vorkommt, kann man es auch aus dem if heraus ziehen. Das Kopieren in andere Variablen ist normalerweise unnötig. Entweder Du rufst Funktionen auf, bei denen die args-Optionen als Parameter übergeben werden, oder Du benutzt im Hauptprogramm args direkt.
BlackJack

@Karpfen: Bei `Argparser` brauchst Du als `description` nicht die ganzen Optionen angeben. Das ist ja einer der Vorteile von `argparse` das man eine automatisch generierte Hilfe mit ``-h`` bekommt.

Vielleicht auch noch mal grundsätzlich etwas zu Optionen: Die heissen so weil sie optional sind, man sie also weglassen kann. Was im Umkehrschluss bedeutet das etwas was man angeben *muss* semantisch keine Option mehr ist sondern ein Argument.
Karpfen
User
Beiträge: 5
Registriert: Mittwoch 4. März 2015, 08:57

vielen dank für die guten beschreibenungne jetzt habe ich es verstanden :-)
Antworten