2009-07-05 7 views
39

Ich habe eine Python-Desktop-Anwendung, die Benutzerdaten speichern muss. Unter Windows ist dies normalerweise in %USERPROFILE%\Application Data\AppName\, auf OSX ist es normalerweise ~/Library/Application Support/AppName/, und auf anderen * nixes ist es normalerweise ~/.appname/.Wie speichere ich Desktop-Anwendungsdaten plattformübergreifend für Python?

Es gibt eine Funktion in der Standardbibliothek, os.path.expanduser, die mir das Home-Verzeichnis eines Benutzers erhält, aber ich weiß, dass "Anwendungsdaten" unter Windows mindestens in der Sprache des Benutzers lokalisiert wird. Das könnte auch für OSX gelten.

Was ist der richtige Weg, um diesen Ort zu bekommen?

UPDATE: Einige weitere Forschung zeigt an, dass der richtige Weg, dies auf OSX zu bekommen, ist durch die Funktion NSSearchPathDirectory verwenden, aber das ist Kakao, so bedeutet es, die PyObjC Brücke Aufruf ...

Antwort

39

Nun, ich hasse es, derjenige zu sein, der meine eigene Frage beantwortet, aber niemand sonst scheint es zu wissen. Ich überlasse die Antwort für die Nachwelt.

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

haben in http://pypi.python.org/pypi/appdirs/1.2.0 – tkone

+1

zu sah Während die Darwin Sachen für Linux ist groß Sie sollten wirklich xdg Pfade verwenden. – abergmeier

+3

Um Hard-Coding "14" und "1" zu vermeiden, funktioniert dies besser: 'von AppKit importieren NSSearchPathForDirectoriesInDomains, NSApplicationSupportDirectory, NSUserDomainMask' –

1

Nun, für Windows APPDATA (Umgebungsvariable) verweist auf den Ordner "Anwendungsdaten" eines Benutzers. Nicht sicher über OSX, obwohl.

Der richtige Weg, meiner Meinung nach, ist es auf einer plattformübergreifenden Basis zu tun.

5

Sie können versuchen, QSettings von Qt zu verwenden. Sie können den Pfad zu Ihrem MyCompany/MyApp.ini Datei auf diese Weise erhalten:

from PySide.QtCore import QSettings, QCoreApplication 

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

Alternativ ohne jede globale Zustandsänderung:

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

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

auf Win7 Sie so etwas wie erhalten

Unter Linux (kann variieren):

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

Ich kenne die möglichen Ergebnisse für OSX nicht (aber ich möchte).

QSettings Functionallity scheint nett zu sein, bis Sie registerFormat verwenden möchten, die in PySide nicht verfügbar ist, so gibt es keine einfache Möglichkeit, YAML- oder JSON-Writer für Einstellungen zu verwenden.