2012-05-17 6 views
7

Sto lavorando su un programma in Python per Windows, e vorrebbe salvare le variabili e le preferenze dell'utente in modo che io possa ricordare, anche dopo che il programma è stato interrotto e riavviato .Come conservare le variabili/preferenze in Python per un uso successivo

C'è un modo ideale per farlo su macchine Windows? _winreg e il registro di Windows sono adatti per questa attività? O devo creare una sorta di database personale?

risposta

3

Di solito si vorrà memorizzarlo in una cartella di configurazione nella cartella "home". È facile su sistemi * nix, più difficili in Windows, perché in realtà è necessario ottenere la directory "dati dell'applicazione". Questo di solito funziona per me:

import os 
if os.name != "posix": 
    from win32com.shell import shellcon, shell 
    homedir = "{}\\".format(shell.SHGetFolderPath(0, shellcon.CSIDL_APPDATA, 0, 0)) 
else: 
    homedir = "{}/".format(os.path.expanduser("~")) 

Dopo aver ottenuto il HomeDirectory, si dovrebbe creare una cartella denominata dopo il progetto:

if not os.path.isdir("{0}.{1}".format(homedir,projectname)): 
    os.mkdir("{0}.{1}".format(homedir,projectname)) 

allora si può fare un file di configurazione nella cartella e scrivere le vostre opzioni ad esso nel formato di tua scelta (il mio preferito è in un XML).

+0

'os.path.expanduser' non funziona ovunque? Perché scrivere più codice? –

+0

Solo usando expanduser non otterrai la cartella dei dati dell'applicazione, che è diversa a seconda che tu sia su winXP o win7. In questo modo si ottiene la directory dei dati dell'applicazione indipendentemente dal sistema operativo Windows. – Josiah

+1

Molte app Python su Windows inseriscono i dati nella cartella principale, non nella sua sottodirectory per i dati delle app. Trovo questo ideale, perché il comportamento è lo stesso su Windows e Linux. (Python, TortoiseHG e un'intera serie di altre app Python.) –

4

A meno che non mi sfugga qualcosa, regex non ha nulla a che fare con il registro di Windows: basta memorizzare un file di configurazione da qualche parte, come la home directory dell'utente o quant'altro.Almeno questo è quello che farei su linux. da qualche parte nel ~/.config/

+0

Mi spiace, intendevo '_winreg'. Fisso! – Parker

0

per salvare le variabili, mi consiglia di utilizzare pickle

1

Se si desidera memorizzare solo coppie chiave-valore di preferenze, farlo in un file di testo di configurazione. Se si desidera memorizzare strutture pitone, farlo con pickle o shelve. Se hai bisogno di luce, senza problemi, rdbms usa sqlite.

1

Mentre il modulo pickle è una scelta ovvia, i file che scrive sarà non-leggibile. Per i file di configurazione, sarebbe opportuno che il tuo file di configurazione fosse un semplice formato di testo che gli utenti possono leggere o persino modificare. Quindi, ti consiglio di usare JSON e il modulo json.

+1

ConfigParser legge e scrive file che assomigliano a file INI, ed è anch'esso integrato. JSON è ottimo per> 2 livelli di gerarchia chiave + valore. –

+0

@WarrenP, uso JSON molto recentemente, e credo che sia diventato il mio formato go-to! Ma non posso discutere contro l'uso di 'ConfigParser' per i file di configurazione; buona idea. – steveha

6

python2 ha ConfigParser, che è ConfigParser, in python3:

import ConfigParser, os 

config = ConfigParser.ConfigParser() 
config.readfp(open('defaults.cfg')) 
config.read(['site.cfg', os.path.expanduser('~/.myapp.cfg')]) 

anche su Windows, si deve essere consapevoli che il registro è un alveare miserabile di feccia e malvagità, e che non si dovrebbe essere ad usarlo per memorizzare le configurazioni dell'app Python.

+4

'dovresti sapere che il registro è un misero alveare di feccia e malvagità. Questa è la cosa più importante che dovresti prendere da questa intera domanda. – Falmarri

+0

Grazie!Non ho mai usato Windows per un certo periodo di tempo, e non ero mai abbastanza sicuro della vista generale del registro, sarò sicuro di stare alla larga se posso – Parker

1

Ci sono diversi modi, diviso in due direzioni principali

  • Accedere al registro di Windows con il modulo _winreg.

Utilizzando il Registro di sistema è non banale trasferire le impostazioni su un'altra macchina o esaminarle o eseguirne il backup; dovresti usare regedit per quelli.

L'altro modo memorizza le preferenze in un file nella cartella "Documenti" dell'utente. Ciò semplifica il trasferimento delle impostazioni a un altro computer o utente e non confonde le impostazioni del programma con quelle di altre applicazioni. Quindi cose come il backup e il ripristino sono più facili; basta copiare un file. Se si sceglie un formato di testo, è anche più facile ispezionare e eseguire il debug delle impostazioni.

  • Inserire le impostazioni in un elenco, tupla o dizionario e salvarle con il modulo cPickle. Questo è probabilmente uno dei metodi più semplici. Il lato negativo, mentre i dati in pickled utilizzano un formato ASCII per impostazione predefinita, non è leggibile dall'uomo.
  • Utilizzare il modulo ConfigParser per salvare e caricare i file di configurazione in una struttura simile ai file .ini di Windows. Questi file sono leggibili.
  • Utilizzare il modulo json per memorizzare le impostazioni in formato json. Questi file sono leggibili.
  • Salvare le preferenze come espressioni Python in un file di testo, caricarlo con execfile(). N.B. Questo potrebbe essere usato per eseguire codice arbitrario, quindi ci sono considerazioni sulla sicurezza. Ma al rialzo, è molto facile e leggibile.
Problemi correlati