[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