Pergunta

Eu estou escrevendo um shell para um projeto meu, que por parses projeto comandos que se parece com isso:

command_name ARG1 = "Long valor" ARG2 = 123 ARG3=me@me.com

O meu problema é que as bibliotecas do Python de linha de comando de análise (getopt e optparse) me obriga a usar '-' ou '-' na frente dos argumentos. Este comportamento não coincide com as minhas necessidades.

Todas as idéias como isso pode ser resolvido? Qualquer biblioteca existente para isso?

Foi útil?

Solução

Você pode dividi-los com shlex.split (), que pode lidar com os valores indicados que você tem, e muito facilmente analisar isso com uma expressão regular muito simples. Ou, você pode apenas usar expressões regulares, tanto para a divisão e análise. Ou simplesmente usar split ().

args = {}
for arg in shlex.split(cmdln_args):
    key, value = arg.split('=', 1)
    args[key] = value

Outras dicas

  1. Tente seguir " Normas para Command Line Interface "

  2. Converta seus argumentos (como Thomas sugeriu) para o formato OptionParser.

    parser.parse_args(["--"+p if "=" in p else p for p in sys.argv[1:]])
    

Se os argumentos de linha de comando não estão em sys.argv ou uma lista similar, mas em uma string, então (como ironfroggy sugerido) uso shlex.split().

parser.parse_args(["--"+p if "=" in p else p for p in shlex.split(argsline)])

Uma pequena variação pythônico em resposta shlex de Ironforggy:

args = dict( arg.split('=', 1) for arg in shlex.split(cmdln_args) )

oops ... -. Corrigido

graças, J.F. Sebastian (Tem que lembrar essas expressões gerador argumento individuais).

E sobre optmatch ( http://www.coderazzi.net/python/optmatch /index.htm )? não é padrão, mas tem uma abordagem diferente para opções de análise, e suporta qualquer prefixo:

OptionMatcher.setMode (optionPrefix = '-')

Sem cirurgia bastante intensivo sobre optparse ou getopt, eu não acredito que você pode fazê-los de forma sensata analisar o seu formato. Você pode facilmente analisar o seu próprio formato, porém, ou traduzi-lo em algo optparse poderia lidar com:

parser = optparse.OptionParser()
parser.add_option("--ARG1", dest="arg1", help="....")
parser.add_option(...)
...
newargs = sys.argv[:1]
for idx, arg in enumerate(sys.argv[1:])
    parts = arg.split('=', 1)
    if len(parts) < 2:
        # End of options, don't translate the rest. 
        newargs.extend(sys.argv[idx+1:])
        break
    argname, argvalue = parts
    newargs.extend(["--%s" % argname, argvalue])

parser.parse_args(newargs)

Um pouco tarde para a festa ... mas PEP 389 permite para isso e muito mais.

Aqui está uma pequena biblioteca agradável deve a sua versão do Python precisa dele code.google.com/p/argparse

Aproveite.

Você pode estar interessado em um pequeno módulo Python Eu escrevi para fazer manipulação de argumentos de linha de comando ainda mais fácil (código aberto e livre para usar) - http://freshmeat.net/projects/commando

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