我需要一个代码片段,可以在所有平台(至少包括Win/Mac/Linux)中获取应用程序数据(配置文件等)的正确目录。例如:在Windows上为% APPDATA%/。
如果你不介意使用appdirs模块,它应该可以解决你的问题。(代价=你需要安装该模块或直接在Python应用程序中包含它。)
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')
这个“习惯用法”以便与旧版本的Python兼容,因为旧版本会返回类似于“linux2”或“linux3”的内容。
您可以使用以下函数获取用户数据目录,已在Linux和Windows 10上进行测试(返回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)
pip install appdata
from appdata import AppDataPaths
app_paths = AppDataPaths()
app_paths.app_data_path # cross-platform path to AppData folder
appdata
包和appdirs
有什么不同? - Taylor D. Edmistonimport sys
if sys.platform == "platform_value":
do_something()
elif sys.platform == "platform_value":
do_something()
列表来自Python官方文档。(搜索 'sys.platform')
~/.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,但是可以更容易地扩展,根据需要。
我遇到了一个类似的问题,我想要动态地解析所有的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应该能够找到它。您可以在此处阅读有关expand vars的更多信息。