Python argparse flag della riga di comando senza argomenti


345

Come faccio ad aggiungere un flag opzionale ai miei arg della riga di comando?

per esempio. così posso scrivere

python myprog.py 

o

python myprog.py -w

Provai

parser.add_argument('-w')

Ma ricevo solo un messaggio di errore che dice

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

che prendo significa che vuole un valore argomento per l'opzione -w. Qual è il modo di accettare una bandiera?

Sto trovando http://docs.python.org/library/argparse.html piuttosto opaco su questa domanda.


4
Se vuoi solo 1 flag per il tuo script, sys.argv sarebbe molto più semplice. A meno che tu non stia specificamente cercando di imparare argparse, il che è un bene perché è un modulo utile da sapere.
vestito il

2
Anche dopo che conosco la risposta ora non vedo come avrei potuto capirlo dalla documentazione.
Andreas Haferburg,

Risposte:


533

Come hai, l'argomento w si aspetta un valore dopo -w sulla riga di comando. Se stai solo cercando di girare un interruttore impostando una variabile Trueo False, dai un'occhiata a http://docs.python.org/dev/library/argparse.html#action (in particolare store_true e store_false)

import argparse

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

dove action='store_true'implicadefault=False .

Al contrario, potresti avere action='store_false', il che implica default=True.


3
@Jdog, hai idea del perché questo non funziona per me? Lo wè sempre False.
Iulian Onofrei,

52

Aggiunta di uno snippet rapido per averlo pronto per l'esecuzione:

Fonte: 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

Uso:

python myparser.py -w
>> True

-10

Ecco un modo rapido per farlo, non richiederà nulla oltre sys.. anche se la funzionalità è limitata:

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

[1:] è nel caso in cui il nome file completo sia --flag


13
Effettua il login semplicemente per esprimere quanto MALE sia un'idea a lungo termine. Immagina di iniziare controllando se la stringa "--flag" è in sys.argv. Quindi guardi la fine di sys.argv [-1] per vedere quale file aprire. All'improvviso ti ritrovi in ​​una situazione in cui se provi ad aprire un file chiamato --flag, allora si comporterà inaspettatamente, e quel che è peggio, è che questo spesso finisce per essere un difetto di sicurezza lungo la strada, quando i dati non attendibili finiscono per essere passato ad argv. Alla fine, questo metodo non dovrebbe essere fatto. I veri parser arg sono molto più robusti ...
Timthelion

3
Come accennato, questa soluzione non è affatto solida, ma funziona se ne hai bisogno in modo super rapido (ad esempio a scopo di test). Tenerlo sicuramente lontano dal codice di produzione.
Jonathan Sudiaman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.