In Gio。我可以使用
列出可重新定位的模式Gio.Settings.list_relocatable_schemas()
,我可以用
Gio.Settings.new_with_path(schema_id, path)
获取Gio.Settings
实例。但是我怎么能得到path
的所有值,目前用于给定的schema_id
?
通常,一个模式有一个固定的路径,该路径决定了设置存储在概念全局设置树中。然而,模式也可以是"可重定位的",即不配备固定的路径。这是有用的,例如当模式描述一个' account ',并且您希望能够存储任意数量的账户。
new_with_path
不就是为了这个吗?您必须将模式存储在与帐户关联的某个地方,但这不是设置系统的责任。我认为new_with_path
适用于你的模式依赖于帐户的情况。
我认为你可以找到更多的信息与GSettingsSchemas -这是一个例子,在描述的情况下,Schema是插件的一部分。
不幸的是,您无法从Gio.Settings中完成此操作。
我在这里看到两个选项:
- 保持单独的gsetting来存储可重定位模式的路径
-
利用dconf API,这是一个底层配置系统。由于没有Python绑定(猜测这是Python的问题),我建议使用ctypes与C绑定。如果你知道你的可重定位模式的根路径,你可以使用下面的代码片段列出它们。
import ctypes from ctypes import Structure, POINTER, byref, c_char_p, c_int, util from typing import List class DconfClient: def __init__(self): self.__dconf_client = _DCONF_LIB.dconf_client_new() def list(self, directory: str) -> List[str]: length_c = c_int() directory_p = c_char_p(directory.encode()) result_list_c = _DCONF_LIB.dconf_client_list(self.__dconf_client, directory_p, byref(length_c)) result_list = self.__decode_list(result_list_c, length_c.value) return result_list def __decode_list(self, list_to_decode_c, length): new_list = [] for i in range(length): # convert to str and remove slash at the end decoded_str = list_to_decode_c[i].decode().rstrip("/") new_list.append(decoded_str) return new_list class _DConfClient(Structure): _fields_ = [] _DCONF_LIB = ctypes.CDLL(util.find_library("dconf")) _DCONF_LIB.dconf_client_new.argtypes = [] _DCONF_LIB.dconf_client_new.restype = POINTER(_DConfClient) _DCONF_LIB.dconf_client_new.argtypes = [] _DCONF_LIB.dconf_client_list.argtypes = [POINTER(_DConfClient), c_char_p, POINTER(c_int)] _DCONF_LIB.dconf_client_list.restype = POINTER(c_char_p)
不能,至少对于任意模式来说不能,这就是可重定位模式的定义:一个模式可以有多个实例,存储在多个任意路径中。
由于可重定位的模式实例基本上可以存储在DConf中的任何位置,gsettings
无法列出它们的路径,它不会跟踪实例。dconf
也帮不了您,因为它根本没有模式的概念,它只知道路径和键。它可以列出给定路径的子路径,但仅此而已。
当创建给定可重定位模式的多个实例时,由应用程序决定是否将每个实例存储在一个合理的、易于发现的路径中,例如(不可重定位的)应用程序模式的子路径。或者在这样的模式中将实例路径(或后缀)存储为列表键。
或者两者兼而有之,就像Gnome Terminal对其配置文件所做的那样:
-
org.gnome.Terminal.ProfilesList
是一个不可重定位的常规模式,存储在DConf路径/org/gnome/terminal/legacy/profiles:/
- 该模式有2个键,一个
default
字符串与单个UUID,和list
字符串包含UUID列表。 - 每个配置文件都是可重定位模式
org.gnome.Terminal.Legacy.Profile
的一个实例,并且存储在,你猜…/org/gnome/terminal/legacy/profiles:/:<UUID>/
!
这样,客户端可以使用gsettings
访问所有实例,读取list
并从uuid构建路径,或者通过直接列出/org/gnome/terminal/legacy/profiles:/
的子路径从dconf
访问所有实例。
gsettings list-schemas --print-paths