2008-10-01 14 views
7

Estoy escribiendo un shell para un proyecto de la mina, que por diseño analiza los comandos que se ve así:línea de comandos personalizada analizar en Python

command_name ARG1 = "Valor a largo" ARG2 = 123 ARG3 me = @ yo .com

Mi problema es que las bibliotecas de análisis de línea de comandos de Python (getopt y optparse) me obligan a usar '-' o '-' delante de los argumentos. Este comportamiento no coincide con mis requisitos.

¿Alguna idea de cómo se puede resolver esto? ¿Alguna biblioteca existente para esto?

+0

Ese espacio en blanco en "Long Valor" que podría dar problemas adicionales . No estoy seguro de que optparse (u otras bibliotecas) pueda manejar esto. – Ralph

+1

@Ralph: optparse maneja "Long Value" bien. – jfs

Respuesta

10

se puede dividir para arriba con shlex.split(), que puede manejar los valores citados que tiene, y con bastante facilidad analizar esto con una expresión regular muy simple. O bien, puede usar expresiones regulares para dividir y analizar. O simplemente use split().

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

En python 2.5 y superior, también puede hacer: key, _, value = arg.partition ('=') – tzot

+2

args = dict (arg.split ('=', 1) para arg en shlex.split (cmdln_args)) – jfs

0

Sin una cirugía bastante intensiva en optparse o getopt, no creo que pueda hacerles analizar el formato. Se puede analizar fácilmente su propio formato, sin embargo, o traducirlo en algo optparse podía manejar:

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

Una pequeña variación en la respuesta Pythonic shlex de Ironforggy:

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

Uy ... - corregido.

gracias, J.F. Sebastian (tengo que recordar esas expresiones de generador de argumento único).

9
  1. tratar de seguir "Standards for Command Line Interfaces"

  2. Convertir sus argumentos (como se sugiere Thomas) a formato OptionParser.

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

Si los argumentos de línea de comandos no están en sys.argv o una lista similar pero en una cadena entonces (como sugirió ironfroggy) utilizan shlex.split().

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

¿Qué pasa con optmatch (http://www.coderazzi.net/python/optmatch/index.htm)? no es estándar, pero tiene un enfoque diferente a las opciones de análisis sintáctico, y es compatible con cualquier prefijo:

OptionMatcher.setMode (optionPrefix = '-')

+0

@rafalotufo, creo que su edición propuesta para esta pregunta debería haber sido un comentario, señalando que una solución propuesta no funcionará está cambiando el significado de una respuesta bastante drásticamente. :) – sarnold

0

poco tarde a la fiesta, pero ... PEP 389 permite este y mucho más.

Aquí hay un poco agradable biblioteca debe su versión de Python que necesita code.google.com/p/argparse~~V~~singular~~3rd

disfrutar.

0

Usted puede estar interesado en un módulo de Python poco me escribió para que el manejo de los argumentos de línea de comandos aún más fácil (código abierto y de uso gratuito) - http://freshmeat.net/projects/commando

Cuestiones relacionadas