Подтвердить что ты не робот

Как хранить данные настольных приложений в кросс-платформенном режиме для python?

У меня есть настольное приложение python, которое должно хранить пользовательские данные. В Windows это обычно находится в %USERPROFILE%\Application Data\AppName\, на OSX обычно ~/Library/Application Support/AppName/, а на других * nixes обычно ~/.appname/.

В стандартной библиотеке существует функция os.path.expanduser, которая получит мне домашний каталог пользователя, но я знаю, что в Windows, по крайней мере, "данные приложения" локализованы на языке пользователя. Это может быть справедливо и для OSX.

Каков правильный способ получить это местоположение?

UPDATE: Некоторые дальнейшие исследования показывают, что правильный способ получить это на OSX - это использовать функцию NSSearchPathDirectory, но это Cocoa, поэтому это означает вызов моста PyObjC...

4b9b3361

Ответ 1

Ну, я ненавижу быть тем, кто отвечает на мой собственный вопрос, но никто больше не знает. Я оставляю ответ для потомков.

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

Ответ 3

Вы можете попытаться использовать QSettings из Qt. Вы можете получить путь к файлу MyCompany/MyApp.ini следующим образом:

from PySide.QtCore import QSettings, QCoreApplication

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

Альтернативно, без изменения глобального состояния:

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

В Win7 вы получите что-то вроде:

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

В Linux (может отличаться):

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

Я не знаю возможных результатов для OSX (но я бы хотел).

QSettings Функциональность кажется приятной до тех пор, пока вы не захотите использовать registerFormat, который недоступен в PySide, поэтому нет простых способов использовать YAML или JSON-записи для настроек.

Ответ 4

Ну, для Windows APPDATA (переменная окружения) указывает на папку "Данные приложения" пользователя. Однако не уверен в OSX.

Правильный способ, на мой взгляд, состоит в том, чтобы сделать это на основе платформы.