2009-07-05 15 views
39

Tengo una aplicación de escritorio python que necesita almacenar datos de usuario. En Windows, esto generalmente está en %USERPROFILE%\Application Data\AppName\, en OSX generalmente es ~/Library/Application Support/AppName/, y en otros * nix es generalmente ~/.appname/.¿Cómo almaceno datos de aplicaciones de escritorio de forma cruzada para python?

Existe una función en la biblioteca estándar, os.path.expanduser que me proporcionará el directorio de inicio de un usuario, pero sé que en Windows, al menos, "Application Data" está localizado en el idioma del usuario. Eso también podría ser cierto para OSX.

¿Cuál es la forma correcta de obtener esta ubicación?

ACTUALIZACIÓN: Algunas investigaciones indica además que la forma correcta de conseguir esto en OSX es mediante el uso de la función NSSearchPathDirectory, pero esa es cacao, lo que significa llamar el puente PyObjC ...

Respuesta

39

Bueno, odio haber sido el único en responder mi propia pregunta, pero nadie más parece saberlo. Dejo la respuesta para la posteridad.

APPNAME = "MyApp" 
import sys 
from os import path, environ 
if sys.platform == 'darwin': 
    from AppKit import NSSearchPathForDirectoriesInDomains 
    # http://developer.apple.com/DOCUMENTATION/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.html#//apple_ref/c/func/NSSearchPathForDirectoriesInDomains 
    # NSApplicationSupportDirectory = 14 
    # NSUserDomainMask = 1 
    # True for expanding the tilde into a fully qualified path 
    appdata = path.join(NSSearchPathForDirectoriesInDomains(14, 1, True)[0], APPNAME) 
elif sys.platform == 'win32': 
    appdata = path.join(environ['APPDATA'], APPNAME) 
else: 
    appdata = path.expanduser(path.join("~", "." + APPNAME)) 
+20

tienen que veía en http://pypi.python.org/pypi/appdirs/1.2.0 – tkone

+1

Mientras que la materia Darwin es ideal para Linux realmente deberías usar rutas xdg. – abergmeier

+3

Para evitar el código rígido "14" y "1", esto funciona mejor: 'desde la importación de AppKit NSSearchPathForDirectoriesInDomains, NSApplicationSupportDirectory, NSUserDomainMask' –

1

Bueno, para APDATA de Windows (variable de entorno) apunta a la carpeta "Datos de aplicación" del usuario. No estoy seguro acerca de OSX, sin embargo.

La forma correcta, en mi opinión, es hacerlo por plataforma.

5

Puede intentar usar QSettings de Qt. Puede obtener la ruta de acceso al archivo de MyCompany/MYAPP.INI esta manera:

from PySide.QtCore import QSettings, QCoreApplication 

QSettings.setDefaultFormat(QSettings.IniFormat) 
QCoreApplication.setOrganizationName("MyCompany") 
QCoreApplication.setApplicationName("MyApp") 
settings = QSettings() 
print(settings.fileName()) 

Alternativamente, sin cambiar ningún estado global:

QSettings(
    QSettings.IniFormat, QSettings.UserScope, 
    "MyCompany", "MyApp" 
).fileName() 

en Win7 se obtiene algo así como:

C:\Users\MyUser\AppData\Roaming\MyCompany\MyApp.ini

En Linux (puede variar):

/home/myuser/.config/MyCompany/MyApp.ini

No conozco los posibles resultados para OSX (pero me gustaría).

QSettings functionallity parece ser bueno hasta que desee utilizar registerFormat, que no está disponible en PySide, por lo que no hay una manera fácil de utilizar los escritores YAML o JSON para la configuración.

Cuestiones relacionadas