2011-03-01 19 views
12

Quiero usar argparse para analizar las líneas de comandos de forma "arg = val" Por ejemplo, el uso sería:Usando argparse para analizar los argumentos de forma "arg = val"

script.py conf_dir=/tmp/good_conf 

para lograrlo , estoy haciendo esto:

desc = "details" 
parser = argparse.ArgumentParser(description=desc, add_help=False) 
args = parser.add_argument("conf_dir") 
args = parser.parse_args("conf_dir=FOO".split()) 
args = parser.parse_args() 
print args.conf_dir 

Pero, el problema es que, en la invocación del script con:

python script.py conf_dir=/tmp/good_conf 

me sale:

conf_dir=/tmp/good_conf 

Cuando, como espero

/tmp/good_conf 

Entonces, la pregunta es: ¿Puedo usar argparse a analizar la línea de cmd, que contiene pares de nombre y valor? ¿Algún consejo?

Editar: La razón por la que quiero hacer esto y no algo como --conf_dir =/tmp/good_dir es porque hay otras herramientas (escritas en otro idioma), que usa conf_dir =/tmp/good_dir estilo de argumentos . Para mantener la coherencia, debía analizar los argumentos de esta manera.

+2

no tengo 'argparse' disponibles para comprobar esto, pero no debería' "conf_dir = FOO" .split() '' ser en realidad "conf_dir = FOO ".split ('=')'? – lafras

Respuesta

4

Según the documentation, argparse no significa de forma nativa le permiten tener opciones sin prefijo por el estilo. Si se deben omitir los -, se supone que usted está describiendo un argumento posicional y espera que proporcionarse como:

python script.py /tmp/good_conf 

si usted quiere que sea opcional, es preciso señalizar correctamente como una bandera llamándolo --conf_dir, e invocando el script como:

python script.py --conf_dir=/tmp/good_conf 

Sin embargo, para aceptar pares nombre-valor, se puede implementar un custom action. En combinación con nargs, una acción de este tipo podría aceptar un número arbitrario de pares de nombre-valor y almacenarlos en el objeto de análisis de análisis de argumentos.

19

Se necesita una acción personalizada

class StoreNameValuePair(argparse.Action): 
    def __call__(self, parser, namespace, values, option_string=None): 
     n, v = values.split('=') 
     setattr(namespace, n, v) 

args = parser.add_argument("conf_dir", action=StoreNameValuePair) 
Cuestiones relacionadas