argparse module Wie füge ich eine Option ohne Argument hinzu?


165

Ich habe ein Skript mit erstellt argparse.

Das Skript muss optional einen Konfigurationsdateinamen verwenden, und der Benutzer kann angeben, ob das Skript vollständig ausgeführt oder nur simuliert werden soll.

Die zu übergebenden Argumente: ./script -f config_file -soder ./script -f config_file.

Es ist in Ordnung für den Teil -f config_file, aber es fragt mich immer wieder nach Argumenten für das -s, was optional ist und von keinem gefolgt werden sollte.

Ich habe das versucht:

parser = argparse.ArgumentParser()
parser.add_argument('-f', '--file')
#parser.add_argument('-s', '--simulate', nargs = '0')
args = parser.parse_args()
if args.file:
    config_file = args.file
if args.set_in_prod:
        simulate = True
else:
    pass

Mit folgenden Fehlern:

File "/usr/local/lib/python2.6/dist-packages/argparse.py", line 2169, in _get_nargs_pattern
nargs_pattern = '(-*%s-*)' % '-*'.join('A' * nargs)
TypeError: can't multiply sequence by non-int of type 'str'

Und der gleiche Fehler mit ''statt 0.

Antworten:


231

Wie @Felix Kling vorgeschlagen Verwendung action='store_true':

>>> from argparse import ArgumentParser
>>> p = ArgumentParser()
>>> _ = p.add_argument('-f', '--foo', action='store_true')
>>> args = p.parse_args()
>>> args.foo
False
>>> args = p.parse_args(['-f'])
>>> args.foo
True

96

Um eine Option zu schaffen , die keinen Wert benötigt, stellen Sie die action [docs] davon 'store_const', 'store_true'oder 'store_false'.

Beispiel:

parser.add_argument('-s', '--simulate', action='store_true')

Hallo, danke für deine Antwort. Ich habe versucht, wie im Dokument erläutert: >>> parser.add_argument ('- foo', '-f', action = 'store_true') _StoreTrueAction (option_strings = ['- foo', '-f'], dest = 'foo', nargs = 0, const = True, default = False, type = None, selection = None, help = None, metavar = None) >>> parser.parse_args () Namespace (foo = False) >> > print args.foo Traceback (letzter Aufruf zuletzt): Datei "<stdin>", Zeile 1, in <module> AttributeError: 'Namespace'-Objekt hat kein Attribut' foo '>>> `Dies scheint nicht zu funktionieren; Ich weiß nicht, wie ich den Wert nach der Zuweisung abrufen soll. Danke für die Hilfe!
Philippe

@philippe: Sie haben vergessen, den parser.parse_args()zurückgegebenen Wert an args stackoverflow.com/questions/5262702/…
jfs

@philippe: args = parser.parse_args()wie du es schon in deinem code hast. Sie müssen nur die kommentierte Zeile ersetzen und können dann auf den Wert mit zugreifen args.simulate.
Felix Kling
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.