2011-03-10 17 views
86

He creado una secuencia de comandos usando argparse.argparse module ¿Cómo agregar la opción sin ningún argumento?

La secuencia de comandos debe tomar un nombre de archivo de configuración como una opción, y el usuario puede especificar si es necesario proceder por completo la secuencia de comandos o solo simularla.

Los argumentos que se aprobarán: ./script -f config_file -s o ./script -f config_file.

Está bien para la parte de archivo de configuración -f, pero me sigue pidiendo argumentos para el -s que es opcional y no debe ser seguido por ninguno.

He intentado esto:

parser = argparse.ArgumentParser() 
parser.add_argument('-f', '--file') 
#parser.add_argument('-s', '--simulate', nargs = '0') 
args = parser.parse_args() 
if args.file: 
    config_file = args.file 
if args.set_in_prod: 
     simulate = True 
else: 
    pass 

Con los siguientes errores:

File "/usr/local/lib/python2.6/dist-packages/argparse.py", line 2169, in _get_nargs_pattern 
nargs_pattern = '(-*%s-*)' % '-*'.join('A' * nargs) 
TypeError: can't multiply sequence by non-int of type 'str' 

Y mismo errror con '' en lugar de 0.

Respuesta

125

Como @Felix Kling suggested uso action='store_true':

>>> from argparse import ArgumentParser 
>>> p = ArgumentParser() 
>>> _ = p.add_argument('-f', '--foo', action='store_true') 
>>> args = p.parse_args() 
>>> args.foo 
False 
>>> args = p.parse_args(['-f']) 
>>> args.foo 
True 
+0

Muchas gracias Felix Kling – philippe

58

Para crear una opción que no necesita ningún valor, configure action[docs] en 'store_const', 'store_true' o 'store_false'.

Ejemplo:

parser.add_argument('-s', '--simulate', action='store_true') 
+0

Hola, Gracias por su respuesta. he tratado como se explica en el documento: >>> parser.add_argument ('- foo', 'f', la acción = 'store_true') _StoreTrueAction (option_strings = [ '- foo', ' f '], dest =' foo', nargs = 0, const = True, por defecto = False, type = Ninguno, opciones = Ninguno, ayuda = Ninguno, metavar = Ninguno) >>> analizador. parse_args() espacio de nombres (foo = false) >>> print args.foo Rastreo (llamadas último el más reciente): archivo "", en la línea 1, AttributeError: objeto 'Espacio de nombres' no tiene atributo 'foo' >>> ' Esto no parece funcionar; I No sé cómo recuperar el valor después de la asignación. ¡Gracias por ayudarme! – philippe

+0

@philippe: has olvidado vincular 'parser.parse_args()' valor devuelto a 'args' http://stackoverflow.com/questions/5262702/argparse-module-how-to-add-option-without-any -argument/5271692 # 5271692 – jfs

+0

@philippe: 'args = parser.parse_args()' como ya tiene en su código. Solo tiene que reemplazar la línea comentada y luego puede acceder al valor con 'args.simulate'. –

Cuestiones relacionadas