2012-05-17 17 views
7

Estoy trabajando en un programa en Python para Windows y me gustaría guardar las variables y las preferencias del usuario para poder recuperarlas incluso después de que el programa haya finalizado y reiniciado .Cómo almacenar variables/preferencias en Python para uso posterior

¿Existe una forma ideal de hacer esto en máquinas con Windows? ¿Sería _winreg y el registro de Windows adecuado para esta tarea? ¿O necesito crear algún tipo de base de datos?

Respuesta

3

Por lo general, querrá guardarlo en una carpeta de configuración en la carpeta "inicio". Eso es fácil en los sistemas * nix, más difícil en las ventanas, porque realmente necesita obtener el directorio "datos de la aplicación". Esto generalmente funciona para mí:

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("~")) 

Después de tener el directorio personal, se debe crear una carpeta con el nombre de su proyecto:

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

entonces usted puede hacer un archivo de configuración en esa carpeta y escribir sus opciones a él en el formato de su elección (mi favorito personal está en un XML).

+0

¿No funciona 'os.path.expanduser' en todas partes? ¿Por qué escribir más código? –

+0

El solo uso de expanduser no le proporcionará la carpeta de datos de la aplicación, que es diferente dependiendo de si está en winXP o win7. Si lo hace de esta manera, obtendrá el directorio de datos de la aplicación independientemente de su sistema operativo Windows. – Josiah

+1

Muchas aplicaciones de Python en Windows colocan datos en su carpeta de inicio, no en su subdirectorio para datos de la aplicación. Encuentro este ideal, porque el comportamiento es el mismo en Windows y Linux. (Python, TortoiseHG y una gran cantidad de otras aplicaciones de Python.) –

4

A menos que me falta algo, regex no tiene nada que ver con el registro de Windows. Simplemente guarde un archivo de configuración en algún lugar, como el directorio de inicio del usuario o lo que sea. Al menos eso es lo que haría en Linux. Almacene un archivo en algún lugar de ~/.config/

+0

Disculpa, quise decir '_winreg'. ¡Fijo! – Parker

0

para guardar las variables, recomiendo el uso de pickle

1

Si desea almacenar sólo pares de clave y valor de las preferencias, lo hacen en un archivo de texto de configuración. Si desea almacenar estructuras de pitón, hacerlo con pickle o shelve. Si necesita una luz, sin problemas, rdbms usa sqlite.

1

Si bien el módulo pickle es una opción obvia, los archivos que escribe no serán legibles por humanos. Para los archivos de configuración, sería bueno que su archivo de configuración fuera un formato de texto simple que sus usuarios puedan leer o incluso editar. Entonces, te recomiendo que uses JSON y el módulo json.

+1

. ConfigParser lee y escribe archivos que se parecen a los archivos INI y también está integrado. Sin embargo, JSON es ideal para> 2 niveles de jerarquía de clave + valor. –

+0

@WarrenP, he estado usando JSON mucho recientemente, ¡y creo que se ha convertido en mi formato de partida! Pero apenas puedo argumentar en contra de usar 'ConfigParser' para los archivos de configuración; buena idea. – steveha

6

python2 tiene ConfigParser, que es ConfigParser, en python3:

import ConfigParser, os 

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

Incluso en las ventanas, debe tener en cuenta que el registro es un desgraciado hervidero de la espuma y de la villanía, y que usted no debe usarlo para almacenar sus configuraciones de aplicaciones de Python.

+4

'debe tener en cuenta que el registro es una miserable colmena de escoria y villanía. Esto es lo más importante que debe tomar de toda esta pregunta. – Falmarri

+0

¡Gracias!No he utilizado Windows extensivamente desde hace tiempo, y nunca estuve completamente seguro de la vista general del registro, me aseguraré de no hablar de él si puedo – Parker

1

Hay varias maneras, dividida en dos direcciones principales

  • acceso al registro de Windows con el módulo _winreg.

Usando el registro no es trivial transferir las configuraciones a otra máquina o inspeccionarlas o respaldarlas; tendrías que usar regedit para eso.

De la otra manera, almacene las preferencias en un archivo en la carpeta 'Mis documentos' del usuario. Esto hace que sea más fácil mover la configuración a otra máquina o usuario, y no mezcla la configuración de su programa con las de una gran cantidad de otras aplicaciones. Entonces, cosas como respaldarlos y restaurarlos son más fáciles; solo copia un archivo Si elige un formato de texto, también es más fácil inspeccionar y depurar la configuración.

  • Ponga su configuración en una lista, tupla o diccionario y guárdelos con el módulo cPickle. Este es probablemente uno de los métodos más fáciles. En el lado negativo, aunque los datos en escabeche utilizan un formato ASCII de manera predeterminada, no es legible para el ser humano.
  • Utilice el módulo ConfigParser para guardar y cargar archivos de configuración en una estructura similar a los archivos de Windows '.ini. Estos archivos son legibles por humanos.
  • Utilice el módulo json para almacenar las configuraciones en formato json. Estos archivos son legibles por humanos.
  • Guarde las preferencias como expresiones de Python en un archivo de texto, cárguelo con execfile(). nótese bien Esto podría usarse para ejecutar código arbitrario, por lo que hay consideraciones de seguridad. Pero al alza, es muy fácil y legible.
Cuestiones relacionadas