módulo argparse ¿Cómo agregar una opción sin ningún argumento?

165

He creado un script usando argparse.

El script necesita tomar un nombre de archivo de configuración como una opción, y el usuario puede especificar si necesita continuar totalmente el script o solo simularlo.

Los argumentos a pasar: ./script -f config_file -so ./script -f config_file.

Está bien para la parte -f archivo_config, pero sigue pidiéndome argumentos para la -s, que es opcional y no debería ser seguida por ninguna.

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 el mismo error con en ''lugar de 0.

philippe
fuente

Respuestas:

232

Como @Felix Kling sugirió usar 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
jfs
fuente
96

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')
Felix Kling
fuente
Hola, gracias por tu respuesta. He intentado como se explica en el documento: >>> parser.add_argument ('- foo', '-f', action = 'store_true') _StoreTrueAction (option_strings = ['- foo', '-f'], dest = 'foo', nargs = 0, const = True, predeterminado = False, type = None, elecciones = None, help = None, metavar = None) >>> parser.parse_args () Espacio de nombres (foo = False) >> > print args.foo Traceback (última llamada reciente): Archivo "<stdin>", línea 1, en <module> AttributeError: el objeto 'espacio de nombres' no tiene atributo 'foo' >>> `Parece que esto no funciona; No sé cómo recuperar el valor después de la asignación. ¡Gracias por ayudarme!
Philip
@philippe: ha olvidado vincular el parser.parse_args()valor devuelto a args stackoverflow.com/questions/5262702/…
jfs
@philippe: args = parser.parse_args()como ya tienes en tu código. Solo tiene que reemplazar la línea comentada y luego puede acceder al valor con args.simulate.
Felix Kling