Как хранить данные настольных приложений в кросс-платформенном режиме для python?
У меня есть настольное приложение python, которое должно хранить пользовательские данные. В Windows это обычно находится в %USERPROFILE%\Application Data\AppName\
, на OSX обычно ~/Library/Application Support/AppName/
, а на других * nixes обычно ~/.appname/
.
В стандартной библиотеке существует функция os.path.expanduser
, которая получит мне домашний каталог пользователя, но я знаю, что в Windows, по крайней мере, "данные приложения" локализованы на языке пользователя. Это может быть справедливо и для OSX.
Каков правильный способ получить это местоположение?
UPDATE:
Некоторые дальнейшие исследования показывают, что правильный способ получить это на OSX - это использовать функцию NSSearchPathDirectory, но это Cocoa, поэтому это означает вызов моста PyObjC...
Ответы
Ответ 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))
Ответ 2
небольшой модуль, который выполняет именно это:
https://pypi.python.org/pypi/appdirs/1.4.0
Ответ 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.
Правильный способ, на мой взгляд, состоит в том, чтобы сделать это на основе платформы.