我想要一个代码片段,它可以在所有平台(至少 Win/Mac/Linux)上为应用程序数据(配置文件等)获取正确的目录。例如:Windows 上的 %APPDATA%/。
6 回答
如果您不介意使用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')
idiom”以与返回“linux2”或“linux3”之类的旧版本 Python 兼容。
您可以使用以下函数获取用户数据目录,在 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)
我建议在您要使用此程序的操作系统中研究“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”)
我遇到了一个类似的问题,我想在事先不知道它们的情况下动态解析所有 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 就应该能够找到它。您可以在此处阅读有关扩展变量的更多信息。
您可以使用名为appdata的模块:
pip install appdata
from appdata import AppDataPaths
app_paths = AppDataPaths()
app_paths.app_data_path # cross-platform path to AppData folder