Python argparse Befehlszeilenflags ohne Argumente

345

Wie füge ich meinen Befehlszeilenargumenten ein optionales Flag hinzu?

z.B. damit ich schreiben kann

python myprog.py 

oder

python myprog.py -w

Ich habe es versucht

parser.add_argument('-w')

Aber ich bekomme nur eine Fehlermeldung

Usage [-w W]
error: argument -w: expected one argument

was ich nehme, bedeutet, dass es einen Argumentwert für die Option -w will. Wie kann man nur eine Flagge akzeptieren?

Ich finde http://docs.python.org/library/argparse.html in dieser Frage ziemlich undurchsichtig.

Interstar
quelle
4
Wenn Sie nur 1 Flag für Ihr Skript möchten, ist sys.argv viel einfacher. Es sei denn, Sie versuchen speziell, Argparse zu lernen, was gut ist, weil es ein praktisches Modul ist, das Sie kennen sollten.
Chown
2
Selbst nachdem ich die Antwort jetzt kenne, sehe ich nicht, wie ich sie aus der Dokumentation hätte verstehen können.
Andreas Haferburg

Antworten:

531

Wie Sie es haben, erwartet das Argument w einen Wert nach -w in der Befehlszeile. Wenn Sie gerade suchen , um einen Schalter zu drehen durch eine variable Einstellung Trueoder Falsehaben einen Blick auf http://docs.python.org/dev/library/argparse.html#action (speziell store_true und store_false)

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-w', action='store_true')

wo action='store_true'impliziert default=False.

Umgekehrt könnten Sie haben action='store_false', was impliziert default=True.

Jdog
quelle
3
@Jdog, Irgendeine Idee, warum das bei mir nicht funktioniert? Das wist immer False.
Iulian Onofrei
52

Hinzufügen eines schnellen Snippets, damit es ausgeführt werden kann:

Quelle: myparser.py

import argparse
parser = argparse.ArgumentParser(description="Flip a switch by setting a flag")
parser.add_argument('-w', action='store_true')

args = parser.parse_args()
print args.w

Verwendungszweck:

python myparser.py -w
>> True
user1767754
quelle
-10

Hier ist ein schneller Weg, es wird nichts anderes benötigt sys.. obwohl die Funktionalität eingeschränkt ist:

flag = "--flag" in sys.argv[1:]

[1:] ist für den Fall, dass der vollständige Dateiname ist --flag

dbalagula23
quelle
13
Einfach angemeldet, um auszudrücken, wie schlecht eine Idee auf lange Sicht ist. Stellen Sie sich vor, Sie überprüfen zunächst, ob sich die Zeichenfolge "--flag" in sys.argv befindet. Dann schauen Sie am Ende von sys.argv [-1] nach, welche Datei geöffnet werden soll. Plötzlich kommt es zu einer Situation, in der sich das Öffnen einer Datei mit dem Namen --flagunerwartet verhält, und was noch schlimmer ist, dass dies später häufig eine Sicherheitslücke darstellt, wenn nicht vertrauenswürdige Daten vorliegen an argv übergeben. Am Ende sollte diese Methode einfach nicht durchgeführt werden. Echte Arg-Parser sind einfach viel robuster ...
Timthelion
3
Wie bereits erwähnt, ist diese Lösung überhaupt nicht robust, funktioniert jedoch, wenn Sie dies sehr schnell erledigen müssen (z. B. zu Testzwecken). Halten Sie es auf jeden Fall vom Produktionscode fern.
Jonathan Sudiaman