Cómo manejar subcomandos de CLI con argparse
Necesito implementar una interfaz de línea de comandos en la que el programa acepte subcomandos.
Por ejemplo, si el programa se llama "foo", la CLI se vería así
foo cmd1 <cmd1-options>
foo cmd2
foo cmd3 <cmd3-options>
cmd1
ycmd3
debe usarse con al menos una de sus opciones y las trescmd*
Los argumentos son siempre exclusivos.
Estoy tratando de usar subparsers en argparse, pero sin éxito por el momento. El problema es concmd2
, eso no tiene argumentos:
si intento agregar la entrada del subparser sin argumentos, el espacio de nombres devuelto porparse_args
no contendrá ninguna información que me indique que esta opción fue seleccionada (ver el ejemplo a continuación). si trato de agregarcmd2
como argumento para elparser
(no el subparser), entonces argparse esperará que elcmd2
el argumento será seguido por cualquiera de los argumentos de los subparsers.
¿Hay una manera simple de lograr esto conargparse
? El caso de uso debería ser bastante común ...
Aquí sigue lo que he intentado hasta ahora que está más cerca de lo que necesito:
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help='Functions')
parser_1 = subparsers.add_parser('cmd1', help='...')
parser_1.add_argument('cmd1_option1', type=str, help='...')
parser_2 = subparsers.add_parser(cmd2, help='...')
parser_3 = subparsers.add_parser('cmd3', help='...')
parser_3.add_argument('cmd3_options', type=int, help='...')
args = parser.parse_args()