2015-02-20 5 views
8

Ich möchte ein erforderliches Argument mit dem Namen inputdir angeben, aber ich möchte auch eine Kurzversion davon i genannt haben. Ich sehe keine übersichtliche Lösung, um dies zu tun, ohne beide optionalen Argumente zu machen und dann meine eigene Prüfung durchzuführen. Gibt es eine bevorzugte Vorgehensweise dafür, dass ich nicht sehe oder der einzige Weg ist, beides optional zu machen und meine eigene Fehlerbehandlung durchzuführen?Wie erstellt man eine kurze und eine lange Version eines erforderlichen Arguments mit Python Argparse?

Hier ist mein Code:

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument("inputdir", help="Specify the input directory") 
parser.parse_args() 

Antwort

11

Für Flaggen (Optionen beginnend mit - oder --) passieren in Optionen mit die Fahnen. Sie können mehrere Optionen angeben:

parser.add_argument('-i', '--inputdir', help="Specify the input directory") 

der See name or flags option documentation:

Die add_argument() Methode wissen muss, ob ein optionales Argument, wie -f oder --foo oder ein Positions Argument, wie eine Liste von Dateinamen ist erwartet. Die ersten Argumente, die an add_argument() übergeben werden, müssen daher entweder eine Reihe von Flags oder ein einfacher Argumentname sein.

Demo:

>>> import argparse 
>>> parser = argparse.ArgumentParser() 
>>> parser.add_argument('-i', '--inputdir', help="Specify the input directory") 
_StoreAction(option_strings=['-i', '--inputdir'], dest='inputdir', nargs=None, const=None, default=None, type=None, choices=None, help='Specify the input directory', metavar=None) 
>>> parser.print_help() 
usage: [-h] [-i INPUTDIR] 

optional arguments: 
    -h, --help   show this help message and exit 
    -i INPUTDIR, --inputdir INPUTDIR 
         Specify the input directory 
>>> parser.parse_args(['-i', '/some/dir']) 
Namespace(inputdir='/some/dir') 
>>> parser.parse_args(['--inputdir', '/some/dir']) 
Namespace(inputdir='/some/dir') 

jedoch das erste Element für erforderlich Argumente ist nur ein Platzhalter. - und -- Optionen sind immer optional (das ist die Befehlszeile Konvention) erforderlich sind Argumente nie mit einem solchen Schalter angegeben. Stattdessen zeigt die Befehlszeilenhilfe an, wo die erforderlichen Argumente mit einem Platzhalter basierend auf dem ersten übergebenen Argument an add_argument() übergeben werden, das ohne Bindestriche übergeben werden soll.

Wenn Sie mit dieser Konvention zu brechen und einen Streit mit - oder -- Start verwenden, die ohnehin erforderlich ist, werden Sie Ihre eigene Kontrolle zu tun haben:

args = parser.parse_args() 
if not args.inputdir: 
    parser.error('Please specify an inputdir with the -i or --inputdir option') 

Hier die parser.error() method drucken die Hilfe-Informationen zusammen mit Ihrer Fehlermeldung, dann beenden.

+0

Vielen Dank für die Klarstellung! Ich schätze deine Hilfe sehr. – user3621633

+0

Die Sache, die ich nicht mag, ist, dass, wenn es die Verwendung druckt, es "-i" und "--inputdir" nicht ausdruckt. Ich möchte, dass die Verwendung etwas wie "Verwendung: [-h] [-i | --inputdir INPUTDIR]" ist; etwas in diesem Sinne. Wahrscheinlich ist es eine Möglichkeit, 'add_mutual_exclusive_group()' zu benutzen, aber das scheint mir ein bisschen hacky zu sein. Ich frage mich, ob es einen besseren Weg gibt. – searchengine27

+0

@ Suchmaschine27: Sie müssten die [help formatter Klasse] anpassen (https://docs.python.org/2/library/argparse.html#formatter-class), fürchte ich. –

Verwandte Themen