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 ...

È stato utile?

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:

https://pypi.org/project/appdirs/

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top