inquirer python command-line-interface

inquirer - Gem/git-style argumentos de línea de comando en Python



python command line arguments (3)

Quería hacer algo similar a los comandos de git, donde cargaría un segundo script basado en una de las opciones de la línea de comandos, y ese script llenaría más opciones de la línea de comandos, y también me ayudaría a trabajar.

Pude hacer esto al deshabilitar la opción de ayuda, analizar argumentos conocidos, agregar más argumentos, volver a habilitar la opción de ayuda y luego analizar el resto de los argumentos.

Esto es lo que se me ocurrió.

import argparse #Note add_help=False arg_parser = argparse.ArgumentParser(description=''Add more arguments after parsing.'',add_help=False) arg_parser.add_argument(''MODE'', default=''default'',type=str, help=''What commands to use'') args = arg_parser.parse_known_args()[0] if args.MODE == ''branch'': arg_parser.add_argument(''-d'', ''--delete'', default=''Delete a branch'') arg_parser.add_argument(''-m'', ''--move'', default=''move a branch'') elif args.MODE == ''clone'' : arg_parser.add_argument(''--local'', ''-l'') arg_parser.add_argument(''--shared'') #Finally re-enable the help option, and reparse the arguments arg_parser.add_argument( ''-h'', ''--help'', action=''help'', default=argparse.SUPPRESS, help=argparse._(''show this help message and exit'')) args = arg_parser.parse_args()

¿Hay un módulo de Python para hacer argumentos de línea de comandos de estilo git / git? Lo que quiero decir con estilo git / git es:

$ ./MyApp.py The most commonly used MyApp commands are: add Add file contents to the index bisect Find by binary search the change that introduced a bug branch List, create, or delete branches checkout Checkout a branch or paths to the working tree ... $ ./MyApp.py branch * current-branch master

Sin argumentos, la salida le indica cómo puede proceder. Y hay un comando especial de "ayuda":

$ ./MyApp.py help branch

Lo que te da consejos más profundos sobre el comando "rama".

Edit: Y al hacerlo me refiero a que hace la impresión de uso para usted, sale con una entrada no válida, ejecuta sus funciones de acuerdo con su especificación de CLI. Tipo de un "asignador de URL" para la línea de comandos.


Sí, argparse con add_subparsers() .

Todo está bien explicado en la sección add_subparsers() .

Copiando uno de los ejemplos de allí:

>>> parser = argparse.ArgumentParser() >>> subparsers = parser.add_subparsers() >>> checkout = subparsers.add_parser(''checkout'', aliases=[''co'']) >>> checkout.add_argument(''foo'') >>> parser.parse_args([''checkout'', ''bar'']) Namespace(foo=''bar'')

Edición: Desafortunadamente, no hay un comando de help especial autogenerado, pero puede recibir el mensaje de ayuda detallado (que parece querer) con -h o --help como lo haría normalmente uno después del comando:

$ ./MyApp.py branch --help

Por verboso no quiero decir que sea como una página de manual, es como cualquier otra - ayuda de tipo ayuda: listar todos los argumentos, etc.

Ejemplo:

>>> parser = argparse.ArgumentParser() >>> subparsers = parser.add_subparsers(description=''Sub description'') >>> checkout = subparsers.add_parser(''checkout'', description=''Checkout description'') >>> checkout.add_argument(''foo'', help=''This is the foo help'') >>> parser.parse_args([''checkout'', ''--help'']) usage: checkout [-h] foo Checkout description positional arguments: foo This is the foo help optional arguments: -h, --help show this help message and exit

Si lo necesita, debería ser fácil implementar un comando de help que redirige a --help .


Un truco razonable para obtener el comportamiento de "ayuda" del estilo gema / git (simplemente escribí esto para lo que estoy trabajando de todos modos):

parser = argparse.ArgumentParser() subparsers = parser.add_subparsers(dest=''sub_commands'') parser_branch = subparsers.add_parser(''branch'', description=''list of branches'') parser_help = subparsers.add_parser(''help'') parser_help.add_argument(''command'', nargs="?", default=None) # I can''t find a legitimate way to set a default subparser in the docs # If you know of one, please let me know! if len(sys.argv) < 2: sys.argv.append(''--help'') parsed = parser.parse_args() if parsed.sub_commands == "help": if not parsed.command: parser.parse_args([''--help'']) else: parser.parse_args([parsed.command, ''--help''])

argparse es definitivamente un paso adelante de optparse y otras soluciones de Python que he encontrado. Pero IMO, el estilo gema / git de manejar argumentos es solo una forma más lógica y segura de hacer las cosas, por lo que es molesto que no sea compatible.