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

StackOverflow https://stackoverflow.com/questions/1084697

Вопрос

У меня есть настольное приложение на 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))

Другие советы

Доступен небольшой модуль, который делает именно это:

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

Вы можете попробовать использовать 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.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top