Python argparse banderas de línea de comando sin argumentos

345

¿Cómo agrego una bandera opcional a mis argumentos de línea de comando?

p.ej. para que yo pueda escribir

python myprog.py 

o

python myprog.py -w

Lo intenté

parser.add_argument('-w')

Pero solo recibo un mensaje de error que dice

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

que tomo significa que quiere un valor de argumento para la opción -w. ¿Cuál es la forma de aceptar una bandera?

Estoy encontrando http://docs.python.org/library/argparse.html bastante opaco en esta pregunta.

interestar
fuente
44
Si solo desea 1 indicador para su script, sys.argv sería mucho más fácil. A menos que esté tratando específicamente de aprender argparse, lo cual es bueno porque es un módulo útil para saber.
vestido el
2
Incluso después de saber la respuesta ahora, no veo cómo podría haberla entendido de la documentación.
Andreas Haferburg

Respuestas:

532

Tal como lo tiene, el argumento w espera un valor después de -w en la línea de comando. Si solo desea activar un interruptor configurando una variable Trueo False, consulte http://docs.python.org/dev/library/argparse.html#action (específicamente store_true y store_false)

import argparse

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

donde action='store_true'implica default=False.

Por el contrario, podría tener action='store_false', lo que implica default=True.

Jdog
fuente
3
@Jdog, ¿Alguna idea de por qué esto no funciona para mí? El wes siempre False.
Iulian Onofrei
52

Agregar un fragmento rápido para tenerlo listo para ejecutar:

Fuente: 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
usuario1767754
fuente
-10

Aquí hay una forma rápida de hacerlo, no requerirá nada además de sys... aunque la funcionalidad es limitada:

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

[1:] es por si el nombre completo del archivo es --flag

dbalagula23
fuente
13
Acabo de iniciar sesión simplemente para expresar cuán MALA es una idea a largo plazo. Imagine que comienza comprobando si la cadena "--flag" está en sys.argv. Luego mira al final de sys.argv [-1] para ver qué archivo abrir. De repente, terminas en una situación en la que si intentas abrir un archivo llamado --flag, se comportará inesperadamente, y lo que es peor, es que esto a menudo termina siendo una falla de seguridad en el futuro, cuando los datos no confiables terminan siendo pasado a argv. Al final, este método simplemente no debería hacerse. Los analizadores de
argumentos
3
Como se mencionó, esta solución no es robusta en absoluto, pero funciona si necesita hacer esto súper rápido (por ejemplo, para fines de prueba). Definitivamente manténgalo alejado del código de producción.
Jonathan Sudiaman