2009-07-05 7 views
39

Ho un'applicazione desktop python che deve memorizzare i dati utente. Su Windows, questo di solito è in %USERPROFILE%\Application Data\AppName\, su OSX di solito è ~/Library/Application Support/AppName/, e su altri * nix di solito è ~/.appname/.Come posso archiviare i dati dell'applicazione desktop in modo multipiattaforma per Python?

Esiste una funzione nella libreria standard, os.path.expanduser, che mi procurerà la directory home dell'utente, ma so che su Windows, almeno, "Dati applicazione" è localizzato nella lingua dell'utente. Questo potrebbe essere vero anche per OSX.

Qual è il modo corretto per ottenere questa posizione?

UPDATE: Alcuni ulteriori ricerche indicano che il modo corretto per ottenere questo su OSX è quello di utilizzare la funzione di NSSearchPathDirectory, ma questo è di cacao, quindi significa chiamando il ponte PyObjC ...

risposta

39

Beh, odio essere stato l'unico a rispondere alla mia stessa domanda, ma nessun altro sembra saperlo. Sto lasciando la risposta per i posteri.

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

devono guardò negli http://pypi.python.org/pypi/appdirs/1.2.0 – tkone

+1

Mentre la roba Darwin è grande per Linux dovresti davvero usare i percorsi xdg. – abergmeier

+3

Per evitare hard-coding "14" e "1", funziona meglio: 'da AppKit import NSSearchPathForDirectoriesInDomains, NSApplicationSupportDirectory, NSUserDomainMask' –

1

Bene, per Windows APPDATA (variabile ambientale) punta alla cartella "Dati applicazione" di un utente. Non sono sicuro di OSX, però.

Il modo corretto, secondo me, è di farlo su una base per piattaforma.

5

Si può provare a utilizzare QSettings da Qt. È possibile ottenere il percorso del file di MyCompany/MyApp.INI questo modo:

from PySide.QtCore import QSettings, QCoreApplication 

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

In alternativa, senza cambiare qualsiasi stato globale:

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

su Win7 si ottiene qualcosa di simile:

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

Su Linux (può variare):

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

Non conosco i possibili risultati per OSX (ma mi piacerebbe).

QSettings functionallity sembra essere carino fino a quando non si desidera utilizzare registerFormat, che non è disponibile in PySide, quindi non esiste un modo semplice per utilizzare i writer YAML o JSON per le impostazioni.

Problemi correlati