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()

Respuestas a la pregunta(2)

Su respuesta a la pregunta