Como posso usar argparse do python com uma string de argumento predefinida?

StackOverflow https://stackoverflow.com/questions/8878478

  •  28-10-2019
  •  | 
  •  

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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top