我想要一个代码片段,获得所有平台(至少Win/Mac/Linux)上应用程序数据(配置文件等)的正确目录。例如:Windows上的%APPDATA%/。
fhg3lkii1#
如果您不介意使用appdirs module,它应该可以解决您的问题(成本=您要么需要安装该模块,要么将其直接包含在Python应用程序中)。
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。
sys.platform.startswith('linux')
vawmfj5a3#
您可以使用以下函数获取用户数据目录,在linux和w10中测试(返回AppData/Local目录),它改编自appdirs包:
AppData/Local
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)
zxlwwiss4#
我建议你研究一下你想使用这个程序的操作系统中“appdata”的位置,一旦你知道了位置,你就可以简单地使用if语句来检测操作系统和do_something()。
import sys if sys.platform == "platform_value": do_something() elif sys.platform == "platform_value": do_something()
列表来自the official Python docs。(搜索“sys. platform”)
6ljaweal5#
您可以使用名为appdata的模块:
pip install appdata
from appdata import AppDataPaths app_paths = AppDataPaths() app_paths.app_data_path # cross-platform path to AppData folder
2izufjch6#
我遇到了一个类似的问题,我想动态地解析所有Windows %路径,而不需要事先知道它们。你可以使用os.path.expandvars来动态地解析路径。
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的信息。
C:\Users\\{user}\AppData\Roaming\MyApp
rryofs0p7#
如果您要查找 config 目录,这里有一个默认为~/.config的解决方案,除非方法的 localplatforms中有特定于平台的(sys.platform)条目:法令
~/.config
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上使用,但是如果需要的话,可以更容易地扩展。
7条答案
按热度按时间fhg3lkii1#
如果您不介意使用appdirs module,它应该可以解决您的问题(成本=您要么需要安装该模块,要么将其直接包含在Python应用程序中)。
qjp7pelc2#
Qt的QStandardPaths documentation列出了如下路径。
使用Python 3.8
Python文档推荐使用
sys.platform.startswith('linux')
“习惯用法”,以兼容返回“linux2”或“linux3”之类内容的旧版本Python。vawmfj5a3#
您可以使用以下函数获取用户数据目录,在linux和w10中测试(返回
AppData/Local
目录),它改编自appdirs包:zxlwwiss4#
我建议你研究一下你想使用这个程序的操作系统中“appdata”的位置,一旦你知道了位置,你就可以简单地使用if语句来检测操作系统和do_something()。
列表来自the official Python docs。(搜索“sys. platform”)
6ljaweal5#
您可以使用名为appdata的模块:
2izufjch6#
我遇到了一个类似的问题,我想动态地解析所有Windows %路径,而不需要事先知道它们。你可以使用
os.path.expandvars
来动态地解析路径。最后一行将打印:
C:\Users\\{user}\AppData\Roaming\MyApp
这适用于Windows,但我没有在Linux上测试过。只要路径是由环境定义的,expandvar就应该能够找到它。你可以在这里阅读更多关于expandvar的信息。rryofs0p7#
如果您要查找 config 目录,这里有一个默认为
~/.config
的解决方案,除非方法的 localplatforms中有特定于平台的(sys.platform
)条目:法令这可以在windows、mac和linux上使用,但是如果需要的话,可以更容易地扩展。