如何从python将'a sv' dbus签名传递给udisks2.Mount()?

Posted

技术标签:

【中文标题】如何从python将\'a sv\' dbus签名传递给udisks2.Mount()?【英文标题】:how to pass 'asv' dbus signature to udisks2.Mount() from python?如何从python将'a sv' dbus签名传递给udisks2.Mount()? 【发布时间】:2021-06-30 14:18:53 【问题描述】:

dbus api 使用一种特殊的格式来描述复杂的参数。

由于编写 dbus 规范时并未考虑到 Python,因此要找出您确切必须传递的参数结构是一项艰巨的任务。

在我的示例中,我想调用 Filesystem 对象的 Mount() 方法。这个方法得到了签名asv

Mount() 是这样定义的

org.freedesktop.UDisks2.Filesystem
...
The Mount() method
Mount (IN  asv options,
       OUT s     mount_path);

来源:http://storaged.org/doc/udisks2-api/latest/gdbus-org.freedesktop.UDisks2.Filesystem.html#gdbus-method-org-freedesktop-UDisks2-Filesystem.Mount

挂载分区的完整代码如下:

bus = dbus.SystemBus()
device = "/org/freedesktop/UDisks2/block_devices/sdi1"
obj = bus.get_object('org.freedesktop.UDisks2', device)
obj.Mount(..., dbus_interface="org.freedesktop.UDisks2.Filesystem")

其中 ... 是有问题的参数。

【问题讨论】:

【参考方案1】:

答案分为不同的层:

参数结构 键名 法律价值

dbus 的参数结构在这里定义:https://dbus.freedesktop.org/doc/dbus-specification.html#type-system

我们从中得知asv 是一个包含一个(或多个?)DICT(键值对列表)的数组。键是 STRING,值是 VARIANT,它是任何类型的数据,前面有一个类型代码。

谢天谢地,我们不必处理低级细节。 Python 会处理这个问题。

所以解决办法就是:

obj.Mount(dict(key="value", key2="value2"), 
dbus_interface="org.freedesktop.UDisks2.Filesystem")

实际的键名在 udisks 文档中定义

IN asv options:   Options - known options (in addition to standard options) 
                    includes fstype (of type 's') and options (of type 's').
    
OUT s mount_path:   The filesystem path where the device was mounted.

来自http://storaged.org/doc/udisks2-api/latest/gdbus-org.freedesktop.UDisks2.Filesystem.html#gdbus-method-org-freedesktop-UDisks2-Filesystem.Mount

而标准选项是指

Option name, Value type, Description
auth.no_user_interaction, 'b', If set to TRUE, then no user interaction will happen when checking if the method call is authorized.

来自http://storaged.org/doc/udisks2-api/latest/udisks-std-options.html

所以,添加我们拥有的键名

obj.Mount(dict(fstype="value", options="value2"), 
dbus_interface="org.freedesktop.UDisks2.Filesystem")

关于价值观我认为你必须研究https://linux.die.net/man/8/mount中的Filesystem Independent Mount OptionsFilesystem Dependent Mount Options部分

所以最终的解决方案看起来像

obj.Mount(dict(fstype="vfat", options="ro"), 
dbus_interface="org.freedesktop.UDisks2.Filesystem")

【讨论】:

以上是关于如何从python将'a sv' dbus签名传递给udisks2.Mount()?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PyQt5 中将字符串数组传递给 dbus? [复制]

将结构传递给 dbus 方法的工具?

如何使用 C 编程从 dbus 传递/返回结构?

如何从 Python 将无符号值发送到 dBus

如何将程序进行数字签名?

在线程内调用 dbus-python