Sinalizadores de linha de comando do Python argparse sem argumentos

345

Como adiciono um sinalizador opcional aos meus argumentos de linha de comando?

por exemplo. para que eu possa escrever

python myprog.py 

ou

python myprog.py -w

eu tentei

parser.add_argument('-w')

Mas eu recebo uma mensagem de erro dizendo

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

pelo que entendi significa que deseja um valor de argumento para a opção -w. Como é aceitar apenas uma bandeira?

Estou achando http://docs.python.org/library/argparse.html bastante opaco nesta questão.

interstar
fonte
4
Se você quiser apenas 1 sinalizador no seu script, o sys.argv seria muito mais fácil. A menos que você esteja especificamente tentando aprender argparse, o que é bom porque é um módulo útil para saber.
chown
2
Mesmo depois de saber a resposta agora, não vejo como eu poderia ter entendido a partir da documentação.
Andreas Haferburg 30/07/19

Respostas:

531

Como você o entende, o argumento w está esperando um valor após -w na linha de comando. Se você deseja ativar um switch configurando uma variável Trueou Falseconsulte http://docs.python.org/dev/library/argparse.html#action (especificamente store_true e store_false)

import argparse

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

onde action='store_true'implica default=False.

Por outro lado, você poderia ter action='store_false', o que implica default=True.

Jdog
fonte
3
@ Dogd, Alguma idéia de por que isso não funciona para mim? O wé sempre False.
Iulian Onofrei 12/04/2015
52

Adicionando um snippet rápido para prepará-lo para execução:

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
user1767754
fonte
-10

Aqui está uma maneira rápida de fazer isso, não exigirá nada além de sys.. embora a funcionalidade seja limitada:

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

[1:] se o nome completo do arquivo for --flag

dbalagula23
fonte
13
Apenas efetue login simplesmente para expressar como essa é uma péssima idéia a longo prazo. Imagine que você comece verificando se a string "--flag" está em sys.argv. Então você olha no final de sys.argv [-1] para ver qual arquivo abrir. De repente, você acaba com uma situação em que, se você tentar abrir um arquivo chamado --flag, ele se comportará inesperadamente, e o pior é que isso geralmente acaba sendo uma falha de segurança no caminho, quando dados não confiáveis ​​acabam sendo passado para argv. No final, esse método simplesmente não deve ser feito. Analisadores arg reais são apenas muito mais robusto ...
timthelion
3
Como mencionado, esta solução não é robusta, mas funciona se você precisar fazer isso com muita rapidez (por exemplo, para fins de teste). Definitivamente, mantenha-o longe do código de produção.
Jonathan Sudiaman