2011-04-08 13 views
10

Tengo un script que debe tomar el nombre de un archivo y un conjunto de pares clave = valor. El conjunto de pares clave = valor no está definido. Ellos dependen del archivo que fue aprobada enPython: pase un diccionario genérico como argumentos de línea de comando

por ejemplo:.

Script.py file1 bob=1 sue=2 ben=3 # file 1 needs bob, sue, and ben 

Script.py file2 mel=1 gorge=3 steve=3 # file 2 needs mel, gorge, and steve 

¿Es esto posible con argparse/optparse o tengo que construir mi propio analizador?

+1

Analizando esto son alrededor de 5 líneas de código ... ¿realmente importa? – Robus

Respuesta

15

Eso debería ser bastante fácil de analizar usted mismo. El uso de las bibliotecas auxiliares se complicaría al no conocer las claves de antemano. El nombre del archivo está en sys.argv [1]. Puede construir el diccionario con una lista de cadenas divididas con el carácter '=' como delimitador.

import sys 
filename = sys.argv[1] 
args = dict([arg.split('=', maxsplit=1) for arg in sys.argv[2:]]) 
print filename 
print args 

Salida:

$ Script.py file1 bob=1 sue=2 ben=3 
file1 
{'bob': '1', 'ben': '3', 'sue': '2'} 

Esa es la esencia de la misma, pero es posible que necesite análisis más robusto de los pares de valores clave que sólo la división de la cadena. Además, asegúrese de tener al menos dos argumentos en sys.argv antes de tratar de extraer el nombre del archivo.

+2

más simple: 'dict (arg.split ('=') para arg en sys.argv [2:])' – kennytm

+0

Gracias por la pista, voy a ir con una combinación: 'parser = argparse.ArgumentParser (descripción = 'diccionario de prueba como args') parser.add_argument ("archivo") parser.add_argument ("diccionario", nargs = '*') args = parser.parse_args() args impresión args.dictionary de impresión print dict ([x.split ('=') para x en args.dictionary]) print args.dictionary .__ class__ ' –

+0

@KennyTM Sí, eso es mejor. Cambié la respuesta. –

0

Espero que esto ayude, en lugar de pasar un diccionario se puede pasar un "escapó" cadena JSON como un argumento de línea de comandos

import optparse 
import json 

parser = optparse.OptionParser() 
parser.add_option("-t", "--test", dest="test", action="store", type="string") 
options, _ = parser.parse_args() 
my_dict = json.loads(options.test) 
print my_dict['key1'] 

luego usarlo como así:

python test.py -t "{\"key1\":\"value1\",\"key2\":\"value2\"}" 

esta salida voluntad "value1"

Cuestiones relacionadas