如何以跨平台方式存储Python桌面应用数据?

42 投票
4 回答
9375 浏览
提问于 2025-04-15 12:41

我有一个用Python写的桌面应用程序,需要存储用户数据。在Windows系统上,这些数据通常保存在%USERPROFILE%\Application Data\AppName\这个地方;在OSX系统上,通常是在~/Library/Application Support/AppName/;而在其他类Unix系统上,通常是在~/.appname/

标准库里有一个函数叫os.path.expanduser,可以帮我找到用户的主目录。不过我知道在Windows上,“Application Data”这个文件夹的名字是根据用户的语言来定的,OSX上可能也是这样。

那么,获取这个位置的正确方法是什么呢?

更新:经过进一步研究,我发现获取OSX上这个位置的正确方法是使用NSSearchPathDirectory这个函数,但这属于Cocoa框架,所以需要调用PyObjC桥接...

4 个回答

6

你可以试试使用来自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()

在Windows 7上,你会得到类似这样的结果:

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

在Linux上(可能会有所不同):

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

我不太清楚OSX的可能结果(但我想知道)。

QSettings的功能看起来不错,但如果你想使用registerFormat,那就不行了,因为在PySide中没有这个功能,所以没有简单的方法可以用YAML或JSON格式来写设置。

23

有一个小模块可以完美地完成这个任务:

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

46

唉,我不太想自己回答自己的问题,但看起来没有其他人知道答案。我把这个答案留着,以便以后的人能看到。

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

撰写回答