2013-06-12 17 views
27

Ich habe durch allot die Subparser-Beispiele hier und im Allgemeinen gesucht, aber ich kann nicht scheinen, diese scheinbar einfache Sache herauszufinden.Wie verwende ich argparse subparsers richtig?

Ich habe zwei Var-Typen, von denen einer Einschränkungen hat, so dachte, subparser war der Weg zu gehen. z.B. -t erlaubt entweder "A" oder "B". Wenn der Benutzer "A" übergibt, muss er außerdem angeben, ob er entweder "a1" oder "a2" ist. Wenn sie nur "B" passieren, dann nichts.

Kann ich das tun und argparse zurückgeben, welche Art von "A" wurde bestanden oder wenn es nur "B" war?

Das unten scheint zu funktionieren, aber aus irgendeinem Grund bricht, wenn etwas nach der Subparse übergeben.

z.B. von einem Linux-Terminal

>> python test01.py -t A a1 -v 61 

Fehler mit ...

usage: test01.py a1 [-h] 
test01.py a1: error: unrecognized arguments: -v 

Hoffentlich, die Sinn macht.

Der Code:

import argparse 

parser = argparse.ArgumentParser() 
subparsers = parser.add_subparsers(help='types of A') 

parser.add_argument("-t", 
        choices = ["A", "B"], 
        dest = "type", 
        required=True, 
        action='store', 
        help="Some help blah blah") 

cam_parser = subparsers.add_parser('a1', help='Default') 
cam_parser.set_defaults(which='a1') 

cam_parser = subparsers.add_parser('a2', help='parse this instead of default') 
cam_parser.set_defaults(which='a2') 


parser.add_argument("-v", 
        nargs = '+', 
        required=True, 
        dest = "version", 
        type=int, 
        action='store', 
        help="some version help blah blah") 

argument = parser.parse_args() 

print argument.type 
print argument.version 

Antwort

26

Subparsers basierend auf dem Wert des ersten Positions Argument aufgerufen werden, so dass Ihr Anruf wie

python test01.py A a1 -v 61 

Die "A" löst die entsprechenden subparser aussehen würde , die definiert würde, um ein Positionsargument und die Option -v zuzulassen.

Da argparse erlegt keine sonst keine Beschränkungen für die Reihenfolge, in der Argumente und Optionen angezeigt werden, und es gibt keine einfache Möglichkeit, zu modifizieren, welche Argumente/Optionen kann einmal erscheinen Parsen hat benutzerdefinierte Aktionen begonnen (etwas beteiligt, die ändern der Parser Instanz funktionieren könnte), dann sollten Sie -t selbst betrachten zu ersetzen:

import argparse 

parser = argparse.ArgumentParser() 
subparsers = parser.add_subparsers(help='types of A') 
parser.add_argument("-v", ...) 

a_parser = subparsers.add_parser("A") 
b_parser = subparsers.add_parser("B") 

a_parser.add_argument("something", choices=['a1', 'a2']) 

Da -v definiert für Hauptparsers, muss es vor das Argument angegeben werden, der angibt, welche subparser für die verwendet wird, bleiben Argumente.

+1

großen vielen Dank. Allerdings bekam ich immer noch einen Fehler, wenn ich -v aus irgendeinem Grund passierte, d. H. Es wurde -v erwartet und als ich es übergeben habe, bekam ich meinen alten Fehler "unerkannte Argumente". Auch wenn ich es vor den Positionsargumenten übergeben habe. Irgendwelche Ideen? Ich habe versucht, ein ähnliches Beispiel zu finden, aber ich hatte nicht viel Glück. – user1571144

+0

ist 'vor dem Argument, das angibt, welcher Subparser 'sich auf den Code des Benutzers bezieht, der das Argument oder beides eingibt? – Nickpick

+0

Es erscheint die Ausführung von 'group1 = parser.add_subparsers (help = 'subparser group 1')' und 'group2 = parser.add_subparsers (help = 'subparser group 2')' gibt 'error: kann nicht mehrere subparser arguments' Fehler haben. Ich hatte gehofft, damit Unterbefehle zu gruppieren. –

Verwandte Themen