24

我想要一个代码片段,它可以在所有平台(至少 Win/Mac/Linux)上为应用程序数据(配置文件等)获取正确的目录。例如:Windows 上的 %APPDATA%/。

4

6 回答 6

18

如果您不介意使用appdirs 模块,它应该可以解决您的问题。(成本 = 您要么需要安装模块,要么直接将其包含在 Python 应用程序中。)

于 2014-03-25T19:35:56.937 回答
11

Qt 的QStandardPaths 文档列出了这样的路径。

使用 Python 3.8

import sys
import pathlib

def get_datadir() -> pathlib.Path:

    """
    Returns a parent directory path
    where persistent application data can be stored.

    # linux: ~/.local/share
    # macOS: ~/Library/Application Support
    # windows: C:/Users/<USER>/AppData/Roaming
    """

    home = pathlib.Path.home()

    if sys.platform == "win32":
        return home / "AppData/Roaming"
    elif sys.platform == "linux":
        return home / ".local/share"
    elif sys.platform == "darwin":
        return home / "Library/Application Support"

# create your program's directory

my_datadir = get_datadir() / "program-name"

try:
    my_datadir.mkdir(parents=True)
except FileExistsError:
    pass

Python 文档推荐使用“ sys.platform.startswith('linux')idiom”以与返回“linux2”或“linux3”之类的旧版本 Python 兼容。

于 2020-05-19T22:17:04.183 回答
2

您可以使用以下函数获取用户数据目录,在 linux 和 w10(返回AppData/Local目录)中测试,它改编自appdirs包:

import sys
from pathlib import Path
from os import getenv

def get_user_data_dir(appname):
    if sys.platform == "win32":
        import winreg
        key = winreg.OpenKey(
            winreg.HKEY_CURRENT_USER,
            r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
        )
        dir_,_ = winreg.QueryValueEx(key, "Local AppData")
        ans = Path(dir_).resolve(strict=False)
    elif sys.platform == 'darwin':
        ans = Path('~/Library/Application Support/').expanduser()
    else:
        ans=Path(getenv('XDG_DATA_HOME', "~/.local/share")).expanduser()
    return ans.joinpath(appname)

于 2020-10-04T14:15:08.817 回答
1

我建议在您要使用此程序的操作系统中研究“appdata”的位置。一旦你知道了位置,你就可以简单地使用 if 语句来检测 os 和 do_something()。

import sys
if sys.platform == "platform_value":
    do_something()
elif sys.platform == "platform_value":
    do_something()
  • 系统:platform_value
  • Linux(2.x 和 3.x):'linux2'
  • 视窗:'win32'
  • Windows/Cygwin:'cygwin'
  • Mac OS X:“达尔文”
  • 操作系统/2:'os2'
  • OS/2 EMX: 'os2emx'
  • RiscoS: 'riscos'
  • AtheOS:'atheos'

列表来自官方 Python 文档。(搜索“sys.platform”)

于 2013-09-29T14:09:48.283 回答
0

我遇到了一个类似的问题,我想在事先不知道它们的情况下动态解析所有 Windows % 路径。您可以使用os.path.expandvars动态解析路径。像这样的东西:

from os import path

appdatapath = '%APPDATA%\MyApp'
if '%' in appdatapath:
    appdatapath = path.expandvars(appdatapath)
print(appdatapath)

最后的行将打印:C:\Users\\{user}\AppData\Roaming\MyApp 这适用于 windows 但是我没有在 Linux 上测试过。只要路径是由环境定义的,expandvars 就应该能够找到它。您可以在此处阅读有关扩展变量的更多信息

于 2021-09-20T19:01:18.213 回答
0

您可以使用名为appdata的模块:

pip install appdata
from appdata import AppDataPaths
app_paths = AppDataPaths()
app_paths.app_data_path  # cross-platform path to AppData folder
于 2021-12-22T18:39:24.103 回答