19 aprile, 2007

Un modulo python per gestire le chiavi in gconf

Aggiornamento: ho aggiornato il modulo che è ora una classe ed include il metodo clean_section


L'ambiente desktop gnome mette a disposizione un ottimo sistema per memorizzare le impostazioni delle sue applicazioni: gconf.

Come funziona gconf?
Gconf è un sistema per la memorizzazione delle configurazioni basato su XML. La configurazione è contenuta in un albero ed ogni applicazione può costruire un suo sottoalbero nel quale memorizzare le proprie impostazioni. Gconf è composto da un demone (gconfd), che si occupa di notificare le applicazioni di eventuali modifiche alla loro configurazione (magari fatte da una applicazione esterna come gconf-editor) e di mantenere una cache dei valori in modo che le applicazioni non siano costrette a dover rifare il parsing del file XML ogni volta, e da un insieme di librerie che rendono semplice l'accesso all'albero gconf.


Come posso accedere/creare chiavi gconf con python?
Usare gconf da python è veramente semplice anche se un minimo di astrazione in più non fa certo male. Per questo vi voglio riportare un piccolo modulo python che permette di comprendere l'uso di gconf oltre che semplificare il processo di creazione/accesso/modifica delle chiavi.

Il codice python


import gtk
import gconf


class MyGconf:

def __init__(self, appname):
self.basedir = "/apps/" + appname
self.client = gconf.client_get_default()

def add_section(self, name, keys):
"""
Aggiunge una sottodirectory a self.basedir e la riempie
con le chiavi specificate nel dizionario keys
"""
dir = self.basedir + "/" + name + "/"
for key, value in keys.iteritems():
path = dir + key
self.client.set_string(path, value)

def clean_section(self, name):
"""
cosa potrebbe mai fare questo metodo :)
"""
dir = self.basedir + "/" + name
self.client.recursive_unset(dir, 0)

def get_sections(self):
"""
Ritorna una tupla contenente l'elenco delle sezioni
contenute in self.basedir
"""
return self.client.all_dirs(self.basedir)

def get_key(self, name):
"""
Ritorna il valore di una specifica chiave.
name deve essere un percorso relativo a self.basedir
"""
path = self.basedir + "/" + name
return self.client.get_string(path)

def set_key(self, name, value):
"""
Imposta il valore della chiave name a value
"""
path = self.basedir + "/" + name
self.client.set_string(path, value)




if __name__ == "__main__":
mg = MyGconf("myapp")
params = {
"test": "test value",
"test2" : "test2 value"
}
mg.add_section("mydir", params)
mg.add_section("mydir2", {"test": "value"})

print mg.get_key("mydir/test")
print mg.get_sections()
mg.set_key("mydir/test", "new value")
print mg.get_key("mydir/test")

mg.remove_section("mydir")


Il codice dovrebbe essere autoescplicativo ;)

2 commenti:

  1. Tutte molto interessanti queste chicche su python :)

    RispondiElimina
  2. Grazie, proprio quello che cercavo!

    RispondiElimina