代码之家  ›  专栏  ›  技术社区  ›  Douglas Mayle

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

  •  40
  • Douglas Mayle  · 技术社区  · 15 年前

    我有一个需要存储用户数据的python桌面应用程序。在窗户上,通常在 %USERPROFILE%\Application Data\AppName\ 在OSX上,通常 ~/Library/Application Support/AppName/ 在其他情况下,通常 ~/.appname/ .

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

    找到这个位置的正确方法是什么?

    更新: 一些进一步的研究表明,在OSX上获得这一点的正确方法是使用函数nssearchpathdirectory,但这是cocoa,所以它意味着调用pyobjc桥…

    4 回复  |  直到 6 年前
        1
  •  42
  •   Douglas Mayle    15 年前

    好吧,我不想成为回答我自己问题的人,但似乎没有其他人知道。我要把答案留给子孙后代。

    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))
    
        2
  •  12
  •   Mattwmaster58    6 年前

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

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

        3
  •  5
  •   Oleh Prypin    10 年前

    你可以试着用 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的可能结果(但我想知道)。

    QSET 功能性似乎很好,直到你想使用 registerFormat 这在Pyside中不可用,因此没有简单的方法可以使用yaml或json编写器进行设置。

        4
  •  1
  •   shylent    15 年前

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

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