如何以跨平台的方式为python存储桌面应用程序数据?

时间:2009-07-05 19:45:44

标签: python desktop-application application-settings

我有一个需要存储用户数据的python桌面应用程序。在Windows上,这通常位于%USERPROFILE%\Application Data\AppName\,在OSX上通常为~/Library/Application Support/AppName/,而在其他* nix上通常为~/.appname/

标准库中存在一个函数os.path.expanduser,它将获取用户的主目录,但我知道在Windows上,至少“应用程序数据”已本地化为用户的语言。 OSX也许如此。

获取此位置的正确方法是什么?

更新 一些进一步的研究表明,在OSX上获得这个的正确方法是使用函数NSSearchPathDirectory,但这是Cocoa,所以它意味着调用PyObjC桥......

4 个答案:

答案 0 :(得分:42)

好吧,我讨厌回答我自己的问题,但似乎没有其他人知道。我正在为后代留下答案。

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

答案 1 :(得分:13)

有一个小模块可以做到这一点:

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

答案 2 :(得分:5)

您可以尝试使用Qt中的QSettings。您可以通过以下方式获取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函数似乎很好,直到你想使用PySide中没有的registerFormat,因此没有简单的方法可以使用YAML或JSON编写器进行设置。

答案 3 :(得分:1)

好吧,对于Windows APPDATA(环境变量)指向用户的“Application Data”文件夹。但不确定OSX。

在我看来,正确的方法是在每个平台的基础上进行。