que - Análisis de línea de comando personalizado en Python
que es el interprete de python (7)
Estoy escribiendo un shell para un proyecto mío, que por diseño analiza comandos que se ven así:
COMMAND_NAME ARG1 = "Valor largo" ARG2 = 123 [email protected]
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?
Intenta seguir " Estándares para interfaces de línea de comando "
Convierte tus argumentos (como sugirió Thomas) al formato OptionParser.
parser.parse_args(["--"+p if "=" in p else p for p in sys.argv[1:]])
Si los argumentos de la línea de comandos no están en sys.argv o en una lista similar, sino en una cadena, entonces (como ironfroggy sugirió) use shlex.split()
.
parser.parse_args(["--"+p if "=" in p else p for p in shlex.split(argsline)])
¿Qué pasa con optmatch ( http://www.coderazzi.net/python/optmatch/index.htm )? No es estándar, pero adopta un enfoque diferente para el análisis de opciones, y admite cualquier prefijo:
OptionMatcher.setMode (optionPrefix = ''-'')
Poco tarde para la fiesta ... pero PEP 389 permite esto y mucho más.
Aquí hay una pequeña biblioteca agradable si tu versión de Python lo necesita code.google.com/p/argparse
Disfrutar.
Podrías dividirlos con shlex.split (), que puede manejar los valores entrecomillados que tienes, y muy fácilmente 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
Puede que le interese un pequeño módulo de Python que escribí para facilitar aún más el manejo de los argumentos de línea de comando (de código abierto y de uso gratuito) - http://freshmeat.net/projects/commando
Sin una cirugía bastante intensiva en optparse o getopt, no creo que pueda hacer que analice su formato. Sin embargo, puede analizar fácilmente su propio formato o traducirlo a algo que optparse podrí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)
Una pequeña variación pitonica en la respuesta shlex de Ironforggy:
args = dict( arg.split(''='', 1) for arg in shlex.split(cmdln_args) )
Uy ... - corregido.
gracias, JF Sebastian (tengo que recordar esas expresiones generadoras de un solo argumento).