42

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

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

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

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

4

4 回答 4

45

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

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))
于 2009-07-06T18:14:36.630 回答
21

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

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

于 2015-11-16T12:18:36.153 回答
6

您可以尝试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 编写器进行设置。

于 2012-12-24T23:30:42.660 回答
0

好吧,对于 Windows APPDATA(环境变量)指向用户的“应用程序数据”文件夹。不过,不确定OSX。

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

于 2009-07-05T19:50:27.447 回答