[Python] come passare un dizionario come argomento ad uno script python

Daniele Varrazzo piro a develer.com
Lun 16 Mar 2009 11:28:08 CET


On Mon, 16 Mar 2009 10:53:25 +0100, federica fanzago
<federicafanzago a gmail.com> wrote:
> Ciao a tutti,
> sto scrivendo uno script shell che deve a sua volta chiamare uno
> script python passandogli un argomento.
> 
> Tale argomento vorrei venisse interpretato dallo script python come un
> dizionario,
> ovvero qualcosa del tipo
> 
> test.py {'citta':'roma', 'stato':'italia'}
> 
> dove {'citta':'roma', 'stato':'italia'} e' il dizionario
> 
> se pero' in test.py mi faccio stampare le chiavi
> ----
> d=sys.argv[1]
> print d.keys()
> -----
> mi dice che ho passato una stringa e non un dizionario....
> 
> come devo fare per passare correttamente come argomento un dizionario
> o come devo fare affinche' nello script python la stringa
> {'citta':'roma', 'stato':'italia'} venga "trasformata" in dizionario?

Ciao,

passare le opzioni ad uno script è un meccanismo standard del sistema
operativo, non qualcosa riguardante il Python, quindi tutto quello che
viene passato sono stringhe e non c'è un meccanismo diretto per passare un
dizionario.

Anche se eval(argv[1]) ti trasformerebbe la stringa in dizionario, NON
FARLO, perchè è fin troppo facile passare al programma qualcosa di
distruttivo.

La cosa più semplice è di passare solo le stringhe al programma, dicamo
una sequenza chiave, valore, chiave, valore... e interpretare quella: per
esempio se invochi lo script con:

    test.py citta roma stato italia

Puoi ottenere il tuo dizionario con:

    >>> L = sys.argv[1:]
    >>> print dict(L[i:i+2] for i in range(0,len(L),2))
    {'citta': 'roma', 'stato': 'italia'}

per esigenze di parsing di command line più complesse, puoi dare
un'occhiata al modulo optparse
(http://docs.python.org/library/optparse.html). La command line comunque
serve per lo più a parsare "opzioni", quindi un elenco "piatto" di
variabili. Se due script devono comunicarsi qualcosa di complesso come
strutture annidiate considera la possibilità di far comunicare via pipe i
due script (esegui "python script1.py | python script2.py", dove script1
scrive su stdout, script2 legge da stdin) e usare un parser generico, come
json (http://docs.python.org/library/json.html) o pickle
(http://docs.python.org/library/pickle.html) per serializzare e
deserializzare gli oggetti.

-- 
Daniele Varrazzo - Develer S.r.l. 
http://www.develer.com


Maggiori informazioni sulla lista Python