Verwenden Sie nargs='?'
(oder nargs='*'
wenn Sie mehr als ein Verzeichnis benötigen)
parser.add_argument('dir', nargs='?', default=os.getcwd())
erweitertes Beispiel:
>>> import os, argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-v', action='store_true')
_StoreTrueAction(option_strings=['-v'], dest='v', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)
>>> parser.add_argument('dir', nargs='?', default=os.getcwd())
_StoreAction(option_strings=[], dest='dir', nargs='?', const=None, default='/home/vinay', type=None, choices=None, help=None, metavar=None)
>>> parser.parse_args('somedir -v'.split())
Namespace(dir='somedir', v=True)
>>> parser.parse_args('-v'.split())
Namespace(dir='/home/vinay', v=True)
>>> parser.parse_args(''.split())
Namespace(dir='/home/vinay', v=False)
>>> parser.parse_args(['somedir'])
Namespace(dir='somedir', v=False)
>>> parser.parse_args('somedir -h -v'.split())
usage: [-h] [-v] [dir]
positional arguments:
dir
optional arguments:
-h, --help show this help message and exit
-v
?
und*
dasselbe, was sie in regulären Ausdrücken bedeuten (dh?
erfordert 0 oder 1 und*
erfordert 0 oder mehr)? Wenn ja, funktioniert+
das auch?+
funktioniert auch. Weitere Informationen finden Sie unter docs.python.org/2/library/argparse.html#nargs .options.dir
, nichtargs.dir
, wie ich es versucht habe!Als Erweiterung zu @VinaySajip Antwort. Es gibt weitere
nargs
erwähnenswerte .parser.add_argument('dir', nargs=1, default=os.getcwd())
N (eine ganze Zahl). N Argumente aus der Befehlszeile werden zu einer Liste zusammengefasst
parser.add_argument('dir', nargs='*', default=os.getcwd())
'*'. Alle vorhandenen Befehlszeilenargumente werden in einer Liste zusammengefasst. Beachten Sie, dass es im Allgemeinen nicht viel Sinn macht, mehr als ein Positionsargument mit zu haben
nargs='*'
, aber mehrere optionale Argumente mitnargs='*'
möglich sind.parser.add_argument('dir', nargs='+', default=os.getcwd())
'+'. Genau wie bei '*' werden alle vorhandenen Befehlszeilenargumente in einer Liste zusammengefasst. Außerdem wird eine Fehlermeldung generiert, wenn nicht mindestens ein Befehlszeilenargument vorhanden war.
parser.add_argument('dir', nargs=argparse.REMAINDER, default=os.getcwd())
argparse.REMAINDER
. Alle verbleibenden Befehlszeilenargumente werden in einer Liste zusammengefasst. Dies ist häufig nützlich für Befehlszeilenprogramme, die an andere Befehlszeilenprogramme gesendet werdenWenn das
nargs
Schlüsselwortargument nicht angegeben wird, wird die Anzahl der verwendeten Argumente von der Aktion bestimmt. Im Allgemeinen bedeutet dies, dass ein einzelnes Befehlszeilenargument verwendet und ein einzelnes Element (keine Liste) erstellt wird.Bearbeiten (kopiert aus einem Kommentar von @Acumenus)
nargs='?'
Die Dokumente sagen: '?'. Ein Argument wird nach Möglichkeit über die Befehlszeile verwendet und als einzelnes Element erstellt. Wenn kein Befehlszeilenargument vorhanden ist, wird der Standardwert erzeugt.quelle
nargs='?'
keine Liste erstellt wird.Generally this means a single command-line argument will be consumed and a single item (not a list) will be produced.
Hoffe, das hilft ...nargs
, sondernnargs='?'
definiert wird. Die Dokumente sagen: '?'. Ein Argument wird nach Möglichkeit über die Befehlszeile verwendet und als einzelnes Element erstellt. Wenn kein Befehlszeilenargument vorhanden ist, wird der Standardwert erzeugt.nargs=argparse.REMAINDER
undnargs='*'
, wie mir scheint, sind sie in ihrer Wirkung identisch (getestet in Python 2.7.10 und Python 3.6.1)?parser.add_argument
hat auch einen Schalter erforderlich . Sie können verwendenrequired=False
. Hier ist ein Beispiel-Snippet mit Python 2.7:quelle