Come faccio a memorizzare i dati dell'applicazione desktop in un modo cross-platform per Python?
-
23-08-2019 - |
Domanda
Ho un'applicazione desktop di pitone che ha bisogno di memorizzare i dati degli utenti. 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/
.
Esiste una funzione nella libreria standard, os.path.expanduser
che mi ottenere la directory home di un utente, ma so che su Windows, almeno, "Dati applicazioni" è localizzato nella lingua dell'utente. Questo potrebbe essere vero per OSX pure.
Qual è il modo corretto per ottenere questa posizione?
UPDATE: Qualche ulteriore ricerca indica 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 ...
Soluzione
Beh, io odio di essere stato quello di rispondere alla mia domanda, ma nessun altro sembra sapere. Lascio 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))
Altri suggerimenti
C'è un piccolo modulo a disposizione che fa esattamente questo:
Si può provare a utilizzare QSettings
da Qt. È possibile ottenere il percorso del file di MyCompany / MyApp.INI in 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()
In 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 so i possibili risultati per OSX (ma mi piacerebbe).
QSettings
functionallity sembrano essere bello fino a che si desidera utilizzare registerFormat
, che non è disponibile in PySide, quindi non c'è modo facile da usare YAML o JSON scrittori per le impostazioni.
Bene, per Windows APPDATA (variabile d'ambiente) punta alla cartella "Dati applicazioni" di un utente. Non sei sicuro di OSX, però.
Il modo corretto, a mio parere, è quello di farlo su una base per-piattaforma.