Si può sicuramente ottenere in qualcosa che assomiglia a un dizionario letterale nel parser argomento, ma hai avuto modo di citarlo in modo che quando la shell analizza la linea di comando, si tratta come
- un singolo argomento invece di molti (il carattere di spazio è il normale delimitatore argomento)
- correttamente citato (il guscio rimuove citazioni durante l'analisi, perché li sta usando per il raggruppamento)
Quindi qualcosa di simile può ottenere il testo che volevi nella tua p rogramma:
python MYSCRIPT.py -i "{\"name\": \"img.png\", \"voids\": \"#00ff00ff\",\"0\": \"#ff00ff00\",\"100%\": \"#f80654ff\"}"
Tuttavia, questa stringa non è un argomento valido al costruttore dict; invece, è uno snippet di codice Python valido. Si potrebbe dire il parser argomento che il "tipo" di questo argomento è eval
, e che funzionerà:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-i','--image', type=eval, help='Generate an image map...')
args = parser.parse_args()
print args
e chiamandolo:
% python MYSCRIPT.py -i "{\"name\": \"img.png\", \"voids\": \"#00ff00ff\",\"0\": \"#ff00ff00\",\"100%\": \"#f80654ff\"}"
Namespace(image={'0': '#ff00ff00', '100%': '#f80654ff', 'voids': '#00ff00ff', 'name': 'img.png'})
Ma questo non è sicuro; l'input potrebbe essere qualsiasi cosa e stai valutando un codice arbitrario. Sarebbe altrettanto ingombrante, ma il seguente sarebbe molto più sicuro:
import argparse
import ast
parser = argparse.ArgumentParser()
parser.add_argument('-i','--image', type=ast.literal_eval, help='Generate an image map...')
args = parser.parse_args()
print args
funziona questo anche, ma è molto più restrittiva su ciò che permetterà di essere eval
'd.
Tuttavia, è molto complicato avere l'utente digitare qualcosa, correttamente citato, che assomiglia ad un dizionario python sulla riga di comando. E dovresti fare dei controlli dopo aver fatto in modo che passassero in un dizionario invece che in qualcos'altro che fossero valutabili e avessero le chiavi giuste. Molto più facile da utilizzare se:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--image-name", required=True)
parser.add_argument("--void-color", required=True)
parser.add_argument("--zero-color", required=True)
parser.add_argument("--full-color", required=True)
args = parser.parse_args()
image = {
"name": args.image_name,
"voids": args.void_color,
"0%": args.zero_color,
"100%": args.full_color
}
print image
Per:
% python MYSCRIPT.py --image-name img.png --void-color \#00ff00ff --zero-color \#ff00ff00 --full-color \#f80654ff
{'100%': '#f80654ff', 'voids': '#00ff00ff', 'name': 'img.png', '0%': '#ff00ff00'}
Si può leggere formati come JSON da un file esterno o stdin, e quindi analizzarlo. Quindi il tipo argparse sarà in realtà un file. –
come @wim ha detto nella sua risposta che la shell sta elaborando gli argomenti prima di passarli a python. Se anteponi il comando con 'echo' ('echo ./script.py -i {' nome ': ...') vedrai cosa sta vedendo python (principalmente non sta ricevendo citazioni). Nel tuo caso che non ci sono '$' nel tuo param (che potrebbe essere interpretato dalla shell come una variabile ambientale) puoi circondare il tuo dict con virgolette doppie: './script.py -i" {'name': ' img.png ', ....} "' –