python values Wie verwende ich argparse Subparser richtig?



python argparse type string (1)

Ich habe alle Subparser-Beispiele hier und im Allgemeinen durchgesehen, kann diese scheinbar einfache Sache aber nicht herausfinden.

Ich habe zwei var-Typen, von denen einer Einschränkungen unterliegt, daher dachte ich, Subparser sei der richtige Weg. zB -t erlaubt entweder "A" oder "B". Wenn der Benutzer "A" übergibt, muss er außerdem angeben, ob es sich um "a1" oder "a2" handelt. Wenn sie gerade "B" dann nichts führen.

Kann ich das tun und mir von argparse zurückgeben lassen, welcher Typ von "A" übergeben wurde oder ob es nur "B" war?

Das Folgende scheint zu funktionieren, bricht jedoch aus irgendeinem Grund ab, wenn nach dem Unterparsen etwas übergeben wird.

zB 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 macht das Sinn.

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

Subparser werden basierend auf dem Wert des ersten Positionsarguments aufgerufen, sodass Ihr Aufruf so aussehen würde

python test01.py A a1 -v 61

Das "A" löst den entsprechenden Subparser aus, der definiert wird, um ein Positionsargument und die Option -v zuzulassen.

Da argparse sonst keine Einschränkungen für die Reihenfolge auferlegt, in der Argumente und Optionen angezeigt werden können, und es keine einfache Möglichkeit gibt, zu ändern, welche Argumente / Optionen nach dem Beginn des Parsens angezeigt werden können (möglicherweise funktionieren benutzerdefinierte Aktionen, mit denen die argparse wird). sollten Sie in Betracht ziehen, -t selbst 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 für den Hauptparser definiert ist, muss es vor dem Argument angegeben werden, das angibt, welcher Unterparser für die übrigen Argumente verwendet wird.





argparse