Flagi wiersza poleceń w języku Python argparse bez argumentów

345

Jak dodać opcjonalną flagę do moich argumentów wiersza poleceń?

na przykład. więc mogę pisać

python myprog.py 

lub

python myprog.py -w

próbowałem

parser.add_argument('-w')

Ale po prostu pojawia się komunikat o błędzie

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

co, jak rozumiem, oznacza, że ​​chce wartości argumentu dla opcji -w. Jak można zaakceptować flagę?

Znajduję http://docs.python.org/library/argparse.html raczej nieprzejrzyste w tym pytaniu.

interstar
źródło
4
Jeśli chcesz tylko 1 flagę w swoim skrypcie, sys.argv byłby o wiele łatwiejszy. Chyba że specjalnie próbujesz nauczyć się argparse, co jest dobre, ponieważ jest to przydatny moduł do poznania.
Chown
2
Nawet po tym, jak znam odpowiedź, nie widzę, jak mogłem ją zrozumieć z dokumentacji.
Andreas Haferburg

Odpowiedzi:

533

Tak jak masz, argument w oczekuje wartości po -w w wierszu poleceń. Jeśli chcesz tylko przełączyć przełącznik, ustawiając zmienną Truelub Falsezajrzyj na http://docs.python.org/dev/library/argparse.html#action (w szczególności store_true i store_false)

import argparse

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

gdzie action='store_true'implikuje default=False.

I odwrotnie, możesz mieć action='store_false', co oznacza default=True.

Jdog
źródło
3
@ Dog, Wiesz, dlaczego to dla mnie nie działa? wJest zawsze False.
Iulian Onofrei
52

Dodanie krótkiego fragmentu umożliwiającego jego wykonanie:

Źródło: 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

Stosowanie:

python myparser.py -w
>> True
użytkownik1767754
źródło
-10

Oto szybki sposób, aby to zrobić, nie wymaga niczego poza sys... chociaż funkcjonalność jest ograniczona:

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

[1:] jest w przypadku, gdy pełna nazwa pliku to --flag

dbalagula23
źródło
13
Właśnie zalogowałem się, aby wyrazić, jak BAD pomysł jest to na dłuższą metę. Wyobraź sobie, że zaczynasz od sprawdzenia, czy ciąg „--flag” znajduje się w sys.argv. Następnie spójrz na koniec sys.argv [-1], aby zobaczyć, który plik otworzyć. Nagle dochodzi do sytuacji, w której próba otwarcia pliku o nazwie --flagbędzie się zachowywać nieoczekiwanie, a co gorsza, często kończy się to błędem w zabezpieczeniach na drodze, gdy niezaufane dane stają się przeszedł do argv. W końcu ta metoda po prostu nie powinna zostać wykonana. Prawdziwe parsery arg są po prostu znacznie bardziej niezawodne ...
timthelion
3
Jak wspomniano, to rozwiązanie nie jest wcale solidne, ale działa, jeśli potrzebujesz tego bardzo szybko (np. Do celów testowych). Zdecydowanie trzymaj go z dala od kodu produkcyjnego.
Jonathan Sudiaman