无法通过DBus-Python连接到org.freedesktop.UDisks

3 投票
2 回答
4749 浏览
提问于 2025-04-16 06:50

这是我第一次使用DBus,请多多包涵。

这是我的代码:

import gobject
import pprint
gobject.threads_init()

from dbus import glib
glib.init_threads()

import dbus
bus = dbus.SessionBus()

remote_object = bus.get_object("org.freedesktop.UDisks", # Connection name
                               "/org/freedesktop/UDisks" # Object's path
                              )

print ("Introspection data:\n")
print remote_object.Introspect()
print remote_object.get_dbus_method("ListNames",dbus_interface="org.freedesktop.DBus")
for item in remote_object.ListNames():
        print item

我遇到的错误是:

dbus.exceptions.DBusException: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.UDisks was not provided by any .service files

来自udisk-demon手册

udisks-daemon在系统消息总线上提供org.freedesktop.UDisks服务。用户或管理员通常不需要手动启动这个守护进程,因为每当有应用程序调用org.freedesktop.UDisks服务时,dbus-daemon(1)会自动启动它。有关如何自定义udisks-daemon工作方式的信息,请参见udisks(7)手册。

编辑:所以是SystemSession()而不是SessionBus()

2 个回答

1

下面这个方法对我有效,但我没有看到你用的ListNames方法,所以我用了EnumerateDevices。

import dbus
bus = dbus.SystemBus()
udisks = bus.get_object("org.freedesktop.UDisks", "/org/freedesktop/UDisks")
udisks = dbus.Interface(udisks, 'org.freedesktop.UDisks')
devices = udisks.get_dbus_method('EnumerateDevices')()
2

你可以试试用 DFeet 来查看这个 dbus 对象是否真的存在。

撰写回答