es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

python::argparse: ¿Cómo imprimir la ayuda nivel por nivel?

Tengo un programa de línea de comandos multinivel como ‘git’.
my_cli servicio acción — opciones

Quiero mostrar el mensaje de ayuda nivel por nivel, Y no quiero que el usuario escriba explícitamente “-h” o “–help”.

Por ejemplo,
$ my_cli <== mostrar ayuda para todos los servicios

$ my_cli service1 <== mostrar ayuda solo para service1

$ my_cli service1 action1 <== mostrar ayuda solo para service1/action1

El código se ve así.

import argparse

argument_parser = argparse.ArgumentParser(description="mi_cli")
root_parsers = argument_parser.add_subparsers(title="service", dest="service")

service1_parsers = root_parsers.add_parser("service1", help="service1").add_subparsers(title="action", dest="action")
service2_parsers = root_parsers.add_parser("service2", help="service2").add_subparsers(title="action", dest="action")

service1_action1_parser = service1_parsers.add_parser("action1", help="action1")
service1_action1_parser.add_argument("-a", "--address", required=True, help="dirección o nombre del servidor")
...

args = argument_parser.parse_args()
if (args.service is None):
    argument_parser.print_help()
    exit(1)
elif (args.action is None):
    if (args.service == "service1"):
        service1_parsers.print_help()    <== Esto no funciona.
        exit(1)
    ...
else:
    if (args.service == "service1") AND (args.action == "action1"):
        service1_action1_parser.print_help()    <== Esto no funciona.
        exit(1)
    ...
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para mostrar un mensaje de ayuda nivel por nivel sin requerir que el usuario escriba explícitamente “-h” o “–help”, puede agregar “help” como un subcomando junto con “servicio1” y “servicio2”, luego agregar sub-subcomandos para cada servicio debajo de “help”. De esta manera, puede usar el mismo analizador para cada nivel de mensaje de ayuda, y el usuario simplemente puede escribir “my_cli” o “my_cli help servicio1” para mostrar el mensaje de ayuda relevante.

    Aquí hay una versión actualizada del código:

    import argparse
    
    argument_parser = argparse.ArgumentParser(description="my_cli")
    root_parsers = argument_parser.add_subparsers(title="subcomando", dest="subcomando")
    
    # Agregar "help" como un subcomando junto con "servicio1" y "servicio2"
    help_parser = root_parsers.add_parser("help", help="mostrar ayuda")
    services_parser = root_parsers.add_parser("servicios", help="listar servicios disponibles")
    
    service1_parsers = help_parser.add_subparsers(title="servicio1", dest="accion_servicio1")
    service2_parsers = help_parser.add_subparsers(title="servicio2", dest="accion_servicio2")
    
    # Agregue subparsers para cada servicio debajo de "help"
    service1_parser = root_parsers.add_parser("servicio1", help="servicio1").add_subparsers(title="acción", dest="accion")
    service2_parser = root_parsers.add_parser("servicio2", help="servicio2").add_subparsers(title="acción", dest="accion")
    
    service1_action1_parser = service1_parser.add_parser("accion1", help="accion1")
    service1_action1_parser.add_argument("-a", "--address", required=True, help="dirección o nombre de host del servidor")
    ...
    
    args = argument_parser.parse_args()
    if args.subcomando == "help":
        if args.accion_servicio1 is None and args.accion_servicio2 is None:
            help_parser.print_help()
        elif args.accion_servicio1 is not None:
            service1_parsers.choices[args.accion_servicio1].print_help()
        elif args.accion_servicio2 is not None:
            service2_parsers.choices[args.accion_servicio2].print_help()
    elif args.subcomando == "servicios":
        print("Servicios disponibles:")
        print("- servicio1")
        print("- servicio2")
    else:
        if args.accion is None:
            argument_parser.print_help()
            exit(1)
        elif args.servicio == "servicio1":
            service1_parsers.choices[args.accion].print_help()
            exit(1)
        ...
    

    Ahora, ejecutando “my_cli” se listarán los servicios disponibles, y ejecutando “my_cli help servicio1” se mostrará el mensaje de ayuda para servicio1.

Comments are closed.