如何以跨平台方式存储Python桌面应用数据?
我有一个用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
有一个小模块可以完美地完成这个任务:
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))