Как мне хранить данные настольного приложения кроссплатформенным способом для python?
-
23-08-2019 - |
Вопрос
У меня есть настольное приложение на python, которому необходимо хранить пользовательские данные.В Windows это обычно происходит в %USERPROFILE%\Application Data\AppName\
, в OSX это обычно ~/Library/Application Support/AppName/
, а на других * никсах это обычно ~/.appname/
.
В стандартной библиотеке существует функция, os.path.expanduser
это даст мне домашний каталог пользователя, но я знаю, что, по крайней мере, в Windows "Данные приложения" локализованы на языке пользователя.Это может быть верно и для OSX.
Каков правильный способ получить это местоположение?
Обновить: Некоторые дальнейшие исследования показывают, что правильный способ получить это в OSX - использовать функцию NSSearchPathDirectory , но это Cocoa, поэтому это означает вызов PyObjC bridge...
Решение
Что ж, мне неприятно быть тем, кто отвечает на мой собственный вопрос, но, похоже, больше никто не знает.Я оставляю ответ для потомков.
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))
Другие советы
Доступен небольшой модуль, который делает именно это:
Вы можете попробовать использовать 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 writers для настроек.
Ну, для Windows APPDATA (переменная среды) указывает на папку пользователя "Данные приложения".Хотя не уверен насчет OSX.
Правильный способ, на мой взгляд, - делать это индивидуально для каждой платформы.