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

2 minutos de lectura

avatar de usuario
Felipe

He creado un script usando argparse.

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

Los argumentos a pasar: ./script -f config_file -s o ./script -f config_file.

Está bien para la parte -f config_file, pero sigue pidiéndome 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 el mismo error con '' en vez de 0.

avatar de usuario
jfs

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

  • ¿No debería ser -s en vez de -f ? AFAIK, la opción -f debería tener un nombre de archivo como opción y la opción -s activa el comportamiento de ejecución en seco. ¿O lo estoy entendiendo mal?

    – nivel de ejecución0

    6 de mayo a las 13:45

  • -f es corto para --foo como en foobar — solo un marcador de posición/nombre ficticio — sin semántica.

    – jfs

    6 de mayo a las 14:12

avatar de usuario
Félix Kling

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

Ejemplo:

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

  • Hola; gracias por tu respuesta. Lo 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=Verdadero, predeterminado=Falso, tipo=Ninguno, opciones=Ninguno, ayuda=Ninguno, metavar=Ninguno) >>> parser.parse_args() Namespace(foo=False) > >> print args.foo Rastreo (última llamada más reciente): Archivo ““, línea 1, en AttributeError: el objeto ‘Namespace’ no tiene atributo ‘foo’ >>>` Esto no parece funcionar ; No sé cómo recuperar el valor después de la asignación. ¡Gracias por ayudarme!

    – Felipe

    11 de marzo de 2011 a las 9:41


  • @philippe: olvidaste enlazar parser.parse_args() valor devuelto a args stackoverflow.com/questions/5262702/…

    – jfs

    11 de marzo de 2011 a las 10:26

  • @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.

    – Félix Kling

    11 de marzo de 2011 a las 10:34

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad