Personalizado linha de análise de comando em Python
-
03-07-2019 - |
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?
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
-
Tente seguir " Normas para Command Line Interface "
-
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