Python:以跨平台方式获取AppData文件夹

k10s72fa  于 2023-01-08  发布在  Python
关注(0)|答案(7)|浏览(255)

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

fhg3lkii

fhg3lkii1#

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

qjp7pelc

qjp7pelc2#

Qt的QStandardPaths documentation列出了如下路径。
使用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')“习惯用法”,以兼容返回“linux2”或“linux3”之类内容的旧版本Python。

vawmfj5a

vawmfj5a3#

您可以使用以下函数获取用户数据目录,在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)
zxlwwiss

zxlwwiss4#

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

import sys
if sys.platform == "platform_value":
    do_something()
elif sys.platform == "platform_value":
    do_something()
  • 系统:平台_值
  • Linux(2.x和3.x):“Linux二代”
  • Windows:“win32”
  • Windows/Cygwin:“天鹅”
  • Mac OS X系统:
  • 操作系统/2:“os 2”
  • 操作系统/2 EMX:“os 2 emx”
  • riscOS:“风险”
  • AtheOS:“无神论者”

列表来自the official Python docs。(搜索“sys. platform”)

6ljaweal

6ljaweal5#

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

pip install appdata
from appdata import AppDataPaths
app_paths = AppDataPaths()
app_paths.app_data_path  # cross-platform path to AppData folder
2izufjch

2izufjch6#

我遇到了一个类似的问题,我想动态地解析所有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上测试过。只要路径是由环境定义的,expandvar就应该能够找到它。你可以在这里阅读更多关于expandvar的信息。

rryofs0p

rryofs0p7#

如果您要查找 config 目录,这里有一个默认为~/.config的解决方案,除非方法的 localplatforms中有特定于平台的(sys.platform)条目:法令

from sys import platform
from os.path import expandvars, join

def platform_config_directory() -> str:
    '''
    Platform config directory
      Entries available in local platforms dict use the current
      "best practice" location for config directories.
      
    Default: $HOME/.config (XDG Base Directory Specification)
      https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
    '''
    home: str = expandvars('$HOME')

    platforms: dict = {
        "win32": expandvars('%AppData%'),
        "darwin": join(home, 'Library', 'Application Support'),
    }

    if platform in platforms:
        return platforms[platform]

    return join(home, '.config')

这可以在windows、mac和linux上使用,但是如果需要的话,可以更容易地扩展。

相关问题