usage parser example argumentparser arg_parser add_argument python argparse

parser - ¿Cómo hacer que python argparse argumentos de grupo mutuamente excluyentes sin prefijo?



arguments parser python (4)

Basándose en la respuesta de Adam ... si quisiera especificar un valor por defecto, siempre podría hacer lo siguiente para dejarlo en blanco.

import argparse ActionHelp = """ Start = Starts the daemon (default) Stop = Stops the daemon Restart = Restarts the daemon """ parser = argparse.ArgumentParser(formatter_class=argparse.RawTextHelpFormatter) parser.add_argument(''action'', nargs = ''?'', choices=(''start'', ''stop'', ''restart''), default = ''start'', help = ActionHelp) print parser.parse_args(''''.split()) print print parser.parse_args(''-h''.split())

que se imprimirá:

Namespace(action=''start'') usage: program.py [-h] [{start,stop,restart}] postional arguments: {start,stop,restart} Start = Starts the daemon (default) Stop = Stops the daemon Restart = Restarts the daemon optional arguments: -h, --help show this help message and exit

Python2.7 argparse solo acepta argumentos opcionales (prefijados) en grupos mutuamente excluyentes:

parser = argparse.ArgumentParser(prog=''mydaemon'') action = parser.add_mutually_exclusive_group(required=True) action.add_argument(''--start'', action=''store_true'', help=''Starts %(prog)s daemon'') action.add_argument(''--stop'', action=''store_true'', help=''Stops %(prog)s daemon'') action.add_argument(''--restart'', action=''store_true'', help=''Restarts %(prog)s daemon'')

$ mydaemon -h

usage: mydaemon [-h] (--start | --stop | --restart) optional arguments: -h, --help show this help message and exit --start Starts mydaemon daemon --stop Stops mydaemon daemon --restart Restarts mydaemon daemon

¿Hay alguna manera de hacer que los argumentos argparse se comporten como el control daemon unix tradicional?

(start | stop | restart) and not (--start | --stop | --restart) ?


Para todas las habilidades y opciones en argparse no creo que alguna vez obtengas una cadena de uso "enlatado" que se parece a lo que quieres.

Dicho esto, ¿has mirado los sub-analizadores desde tu publicación original?

Aquí hay una implementación de barebones:

import argparse parser = argparse.ArgumentParser(prog=''mydaemon'') sp = parser.add_subparsers() sp_start = sp.add_parser(''start'', help=''Starts %(prog)s daemon'') sp_stop = sp.add_parser(''stop'', help=''Stops %(prog)s daemon'') sp_restart = sp.add_parser(''restart'', help=''Restarts %(prog)s daemon'') parser.parse_args()

Ejecutar esto con la opción -h produce:

usage: mydaemon [-h] {start,stop,restart} ... positional arguments: {start,stop,restart} start Starts mydaemon daemon stop Stops mydaemon daemon restart Restarts mydaemon daemon

Uno de los beneficios de este enfoque es poder usar set_defaults para cada sub-analizador para conectar una función directamente al argumento. También agregué una opción "agraciada" para stop y restart :

import argparse def my_stop(args): if args.gracefully: print "Let''s try to stop..." else: print ''Stop, now!'' parser = argparse.ArgumentParser(prog=''mydaemon'') graceful = argparse.ArgumentParser(add_help=False) graceful.add_argument(''-g'', ''--gracefully'', action=''store_true'', help=''tries to terminate the process gracefully'') sp = parser.add_subparsers() sp_start = sp.add_parser(''start'', help=''Starts %(prog)s daemon'') sp_stop = sp.add_parser(''stop'', parents=[graceful], description=''Stops the daemon if it is currently running.'', help=''Stops %(prog)s daemon'') sp_restart = sp.add_parser(''restart'', parents=[graceful], help=''Restarts %(prog)s daemon'') # Hook subparsers up to functions sp_stop.set_defaults(func=my_stop) # Uncomment when my_start() and # my_restart() are implemented # # sp_start.set_defaults(func=my_start) # sp_restart.set_defaults(func=my_restart) args = parser.parse_args() args.func(args)

Mostrando el mensaje de "ayuda" para stop :

$ python mydaemon.py stop -h usage: mydaemon stop [-h] [-g] Stops the daemon if it is currently running. optional arguments: -h, --help show this help message and exit -g, --gracefully tries to terminate the process gracefully

Detener "con gracia":

$ python mydaemon.py stop -g Let''s try to stop...


Parece que quieres un argumento posicional en lugar de opciones mutuamente excluyentes. Puede usar ''elecciones'' para restringir las posibles opciones aceptables.

parser = ArgumentParser() parser.add_argument(''action'', choices=(''start'', ''stop'', ''restart''))

Esto produce una línea de uso que se ve así:

usage: foo.py [-h] {start,stop,restart}


de pymotw

import argparse parser = argparse.ArgumentParser() group = parser.add_mutually_exclusive_group() group.add_argument(''-a'', action=''store_true'') group.add_argument(''-b'', action=''store_true'') print parser.parse_args()

salida:

$ python argparse_mutually_exclusive.py -h usage: argparse_mutually_exclusive.py [-h] [-a | -b] optional arguments: -h, --help show this help message and exit -a -b $ python argparse_mutually_exclusive.py -a Namespace(a=True, b=False) $ python argparse_mutually_exclusive.py -b Namespace(a=False, b=True) $ python argparse_mutually_exclusive.py -a -b usage: argparse_mutually_exclusive.py [-h] [-a | -b] argparse_mutually_exclusive.py: error: argument -b: not allowed with argument -a

versión 2

import argparse parser = argparse.ArgumentParser() subparsers = parser.add_subparsers(help=''commands'') # A list command list_parser = subparsers.add_parser(''list'', help=''List contents'') list_parser.add_argument(''dirname'', action=''store'', help=''Directory to list'') # A create command create_parser = subparsers.add_parser(''create'', help=''Create a directory'') create_parser.add_argument(''dirname'', action=''store'', help=''New directory to create'') create_parser.add_argument(''--read-only'', default=False, action=''store_true'', help=''Set permissions to prevent writing to the directory'', ) # A delete command delete_parser = subparsers.add_parser(''delete'', help=''Remove a directory'') delete_parser.add_argument(''dirname'', action=''store'', help=''The directory to remove'') delete_parser.add_argument(''--recursive'', ''-r'', default=False, action=''store_true'', help=''Remove the contents of the directory, too'', ) print parser.parse_args([''list'', ''a s d'', ]) >>> Namespace(dirname=''a s d'') print parser.parse_args([''list'', ''a s d'', ''create'' ]) >>> error: unrecognized arguments: create