Como posso usar argparse do python com uma string de argumento predefinida?
Pergunta
Quero usar o módulo pythons argparse para analisar minha string de parâmetro cli.Isso funciona para os parâmetros que passam do terminal, mas não com uma determinada string.
import argparse
parser = argparse.ArgumentParser(description='Argparse Test script')
parser.add_argument("param", help='some parameter')
argString = 'someTestFile'
print(argString)
args = parser.parse_args(argString)
Se eu executar este script, obtenho esta saída:
~/someTestFile
usage: argparsetest.py [-h] param
argparsetest.py: error: unrecognized arguments: o m e T e s t F i l e
O ~/someTestFile
é de alguma forma transformado em o m e T e s t F i l e
.Como já mencionado, funciona se eu passar o nome do arquivo do terminal.
Eu poderia imaginar que isso tem algo a ver com codificações de string.Alguém tem uma ideia de como consertar isso?
Solução
Ah, não não não.parser.parse_args()
espera uma sequência na mesma forma que sys.argv[1:]
.Se você tratar uma string como uma sequência sys.argv, obterá ['s', 'o', 'm', 'e', 'T', 'e', 's', 't', 'F', 'i', 'l', 'e']
.'s' torna-se o argumento relevante, e então o resto da string não pode ser analisada.
Em vez disso, você provavelmente deseja passar parser.parse_args(['someTestFile'])
Outras dicas
Outra opção é usar shlex.split .É especialmente muito conveniente se você tiver uma string de argumentos CLI real:
import shlex
argString = '-vvvv -c "yes" --foo bar --some_flag'
args = parser.parse_args(shlex.split(argString))
Assim como o sys.argv
padrão é uma lista, seus argumentos também devem ser uma lista.
args = parser.parse_args([argString])
Simplesmente split
sua string de comando:
args = parser.parse_args(argString.split())
Um exemplo completo para mostrar:
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--dummy_opt', nargs='*', type=int, help='some ids')
argString = "--dummy_opt 128 128"
args = parser.parse_args(argString.split())
print(args)
produzirá:
Namespace(pic_resize=[128, 128])