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