2016-09-12 4 views
0

Ich habe folgende Schnipsel, wo ich verwende argparse mit mehreren subparsersPython argparse, Positionsargumente und subparsers

parser = argparse.ArgumentParser(description = "Setup the DB", 
     add_help=False) 
parser.add_argument('action', type = str, 
     choices=['drop','populate','print','create','print-metadata'], 
     help = "Specify an action", default = None) 
subparsers = parser.add_subparsers() 
drop_parser = subparsers.add_parser('drop',parents=[parser]) 
drop_parser.add_argument('-dataset-name', 
     required=True, 
     type = str, help = "Dataset Name", 
     default = None) 
..... 
args = parser.parse_args() 
..... 

Wenn ich dies laufen ich folgendes erhalten:

python .\populatedb.py drop -dataset-name foo 
populatedb.py: error: invalid choice: 'foo' (choose from 'drop', 'populate', 'print', 'create', 'print-metadata') 

Ich bin frage mich, wo der Code oben falsch läuft. Beachten Sie, dass das Argument "Aktion" ein Positionsargument ist.

Vielen Dank im Voraus. Dies ist meine erste Verwendung von Subparsern. Ich mache wahrscheinlich einen offensichtlichen Fehler.

Vielen Dank im Voraus.

Grüße,

Ranga

+0

Warum fügen Sie ein Argument für den Subparser hinzu? – mgilson

+0

Danke für die schnelle Antwort. Das Argument ist nur für die Aktion "drop" sinnvoll. Für andere Optionen ist es nicht sinnvoll, daher habe ich es dem Subparser hinzugefügt. Ich habe die anderen Subparser aus Gründen der Klarheit weggelassen. – LostInTheFrequencyDomain

+0

Es fühlt sich so an, als müssten Sie 'Action Drop' hinzufügen. Sie können python popledb.py -h ausführen, um die Abfolge der Argumente zu sehen, die Sie übergeben müssen. –

Antwort

0

Die allgemein akzeptierte, was hier zu tun ist, nicht für die subparser ein Argument zu haben - es ist es eigenes Argument von argparse vorgesehen ist: Jetzt

parser = argparse.ArgumentParser(description = "Setup the DB", 
     add_help=False) 
subparsers = parser.add_subparsers() 
drop_parser = subparsers.add_parser('drop',parents=[parser]) 
drop_parser.add_argument('-dataset-name', 
     required=True, 
     type = str, help = "Dataset Name", 
     default = None) 
..... 
args = parser.parse_args() 

Sie wissen nicht unbedingt, welcher Parser ausgewählt wurde, aber keine Sorge, dafür gibt es auch einen eingebauten Mechanismus. Ein gemeinsamer Anwendungsfall ist mit einer Funktion, die für jeden subparser aufgerufen werden soll ...

parser = argparse.ArgumentParser(description = "Setup the DB", 
     add_help=False) 
subparsers = parser.add_subparsers() 

def drop_parser_handler(args): 
    ... 

drop_parser = subparsers.add_parser('drop',parents=[parser]) 
drop_parser.add_argument('-dataset-name', 
     required=True, 
     type = str, help = "Dataset Name", 
     default = None) 
drop_parser.set_defaults(func=drop_parser_handler) 
..... 

args = parser.parse_args() 
args.func(args) 

Natürlich brauchen Sie nicht alles, was diesen Komplex zu tun - Sie könnten nur einen konstanten Wert gesetzt:

drop_parser.set_defaults(subparser_name='drop') 
+0

Vielen Dank! Das hat geholfen. – LostInTheFrequencyDomain

Verwandte Themen