Como lidar com subcomandos da CLI com argparse

Preciso implementar uma interface de linha de comando na qual o programa aceite subcomandos.

Por exemplo, se o programa for chamado "foo", a CLI parecerá

foo cmd1 <cmd1-options>
foo cmd2
foo cmd3 <cmd3-options>

cmd1 ecmd3 deve ser usado com pelo menos uma de suas opções e os trêscmd* argumentos são sempre exclusivos.

Estou tentando usar sub-analisadores em argparse, mas sem sucesso no momento. O problema é comcmd2, que não possui argumentos:

se eu tentar adicionar a entrada do sub-analisador sem argumentos, o espaço para nome retornado porparse_args não conterá nenhuma informação informando que essa opção foi selecionada (veja o exemplo abaixo). se eu tentar adicionarcmd2 como argumento para oparser (não o sub-analisador), então argparse espera que ocmd2 O argumento será seguido por qualquer um dos argumentos das subparsers.

Existe uma maneira simples de conseguir isso comargparse? O caso de uso deve ser bastante comum…

A seguir, o que eu tentei até agora e que está mais próximo do que eu preciso:

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

questionAnswers(2)

yourAnswerToTheQuestion