2016-04-25 7 views
0

Hallo Ich versuche, Argparse mit mehreren Subparser konfigurieren, die nur bestimmte lange Argumente akzeptieren. Hier unten ist der CodeVerwenden Sie Python Argparse mit mehreren Subparsern

import argparse 

parser = argparse.ArgumentParser(prog='program', description='Prog Description') 
subparsers = parser.add_subparsers(help='choices') 
parser.add_argument('--choice', '-c', choices=['a', 'apple', 'b', 'banana', 'l', 'lemmon', 'p', 'papaya'], type=str, help='Menu Choices', required=True) 
a_parser = subparsers.add_parser("a") 
b_parser = subparsers.add_parser("b") 
l_parser = subparsers.add_parser("l") 
p_parser = subparsers.add_parser("p") 

a_parser.add_argument("--peel") 
b_parser.add_argument("--peel") 
l_parser.add_argument("--lamount") 
p_parser.add_argument("--pamount",required=True,type=str) 

Aber ich versage bei folgenden Punkten.

  • Subparser sollten sowohl Kurzform als auch Langform akzeptieren. Ex. prog -c a und prog -c apple sind beide legal und gleich
  • argumens für subparsers sind nicht erforderlich, außer für die --pamount. Aber Code scheint sie zu erwarten, da ich folgenden Fehler erhalte, wenn ich einen gültigen Modus ausführe python prog -c a

    usage: programm [-h] --choice {a, apfel, b, banane, l, lemmon, p, papaya} {a, p, b, l} ... Programm: Fehler: zu wenig Argumente

ich bin froh, wenn mir jemand einige Richtlinien, diese Probleme zu lösen bieten könnte. Danke!

Antwort

0

Wenn Sie subparsers verwenden, benötigen Sie nicht die Option --choice.

subparsers = parser.add_subparsers(dest='choice', help='choices') 
# parser.add_argument('--choice', '-c', choices=['a', 'apple', 'b', 'b ... 

die dest Geben Sie einen Schlitz in der args für den subparser Namen (siehe die Dokumentation) zu definieren. Wenn Sie 'python prog -c a' verwenden, analysiert es das a als Argument -c; aber es erwartet immer noch eine Zeichenfolge wie a als Argument für die subparsers (die in der Tat ein Positionsargument ist). Daher der Fehler. (Mit anderen Worten, es wird nicht erwartet, das --peel Argument, es nicht so weit in dem Parsing bekommen hat.)

python prog a 
python prog a --peel 3 

funktionieren soll.

python prog p --pamount 1 

sollte auch funktionieren (der --Pount ist erforderlich).

Um sowohl 'a' als auch 'apple' als Unterparsernamen zu akzeptieren, verwenden Sie den Parameter aliases (siehe Dokumentation für add_parser).

a_parser = subparsers.add_parser("a", aliases=['apple','apples','manzana']) 
+0

Danke für die Antwort und es war wirklich hilfreich bei der Ermittlung der Ansatz. Allerdings ist der Fehler immer noch da, als ich gerade überprüft habe, dass die 'Aliase' in Python 2.7 neu sind und ich Python 2.6 benutze und es in dieser Version benutzen muss. Auch wenn ich 'dest = 'choice' anfüge, kann ich den Argumenten keine Kurzform' c' hinzufügen. –

+0

Sie sollten in der Lage sein, die 'argparse.py' Datei von einem 2.7 Python zu stehlen und in Ihr eigenes Verzeichnis zu legen. – hpaulj

+0

Ja, ich werde eine ähnliche Sache tun, wie die aktuelle Argarse-Modul-Version ist 1.2.1 und ich werde es auf 1.4.1 zu aktualisieren. Dies sollte das Problem lösen. :) –