pythondbus:自定义DBus方法名和d

2024-10-04 01:26:32 发布

您现在位置:Python中文网/ 问答频道 /正文

<太长了,读不下去了,博士><强>

是否有任何方法可以为导出的d-bus方法指定一个与所修饰的方法名不同的自定义名称?在


所以这里有一个协议:我想要一个寄存器,在D-Bus上有多个接口,所有接口都有相同的方法(不同的实现):

/com/quaintous
|- com.quaintous.iface1
|  |- GET
|- com.quaintous.iface2
|  |- GET

如果我要使用一个表示单个对象的类,并使用method decorator将该类的方法导出到d-bus,我就不能有两个同名的方法(第二个方法将覆盖第一个方法)。在


示例代码(所需)

^{pr2}$

类似于name="GET"。在


更新

python-debus实际上将类方法名与D-Bus方法名进行一对一的映射,由于一个类不能包含两个同名的方法,因此似乎不可能做到这一点。我在考虑重写^{}作为最后的手段,但我希望有更好的解决方案。在


Tags: 对象方法名称com协议getdecorator寄存器
1条回答
网友
1楼 · 发布于 2024-10-04 01:26:32

<太长了,读不下去了,博士><强>

不,我不认为dbus python可以这样做,但下面是一个解决方法:


如果要求只有一个类,这就有问题,因为Python本身不支持方法重载,因此在同一个类中不能有多个具有完全相同名称的方法。我假设这个用例是在不同接口下的D-Bus上导出的多个方法之间共享一个方法的实现?如果是这样,就有了解决办法。在

我相信您正在使用的D-Bus绑定(dbus python)将根据在服务上调用的方法名按名称查找方法,并将其与接口字符串匹配(如果存在这样的字符串)。在

方法查找是使用方法名作为服务类的类层次结构中的类的__dict__字典中的键来完成的。我相信,这意味着在不改变dbuspython本身的情况下,没有简单的方法可以让dbuspython寻找另一种方法。但是,这意味着层次结构中的某个类只需要有一个具有正确名称的方法的类,该方法用特定的接口字符串修饰。在

如果您创建了一个继承层次结构,其中所有方法都出现在一个单独的类中(每个方法有不同的接口字符串),并且共享实现实际逻辑的父级,那么它似乎以您想要的方式出现在总线上。下面是一个例子:

import gobject
import dbus
import dbus.service

from dbus.mainloop.glib import DBusGMainLoop
DBusGMainLoop(set_as_default=True)


OPATH = "/temp/Test"
IFACE = "temp.Test"
BUS_NAME = "temp.Test"


class Implementation(object):
    # This is the implementation shared by the methods exported on the bus
    def theX(self, arg):
        print arg


class MyService(dbus.service.Object):
    def __init__(self):
        bus = dbus.SessionBus()
        bus.request_name(BUS_NAME, dbus.bus.NAME_FLAG_REPLACE_EXISTING)
        bus_name = dbus.service.BusName(BUS_NAME, bus=bus)
        dbus.service.Object.__init__(self, bus_name, OPATH)


class IfaceOne(MyService, Implementation):
    def __init__(self):
        MyService.__init__(self)

    @dbus.service.method(dbus_interface=IFACE + ".IfaceOne", in_signature='s')
    def X(self, arg):
        super(IfaceOne, self).theX(arg)


class IfaceTwo(IfaceOne, Implementation):
    def __init__(self):
        MyService.__init__(self)

    @dbus.service.method(dbus_interface=IFACE + ".IfaceTwo", in_signature='s')
    def X(self, arg):
        super(IfaceTwo, self).theX(arg)


if __name__ == "__main__":
    iface_two = IfaceTwo()
    loop = gobject.MainLoop()
    loop.run()

有关更多详细信息,您可以克隆dbus python git并查看service.py中的_method_lookup方法。method修饰符在decorators.py中实现。在

希望这有帮助。在

相关问题 更多 >