为啥不能在 Python 中使用 dbus 调用 org.freedesktop.NetworkManager 中的方法?
Posted
技术标签:
【中文标题】为啥不能在 Python 中使用 dbus 调用 org.freedesktop.NetworkManager 中的方法?【英文标题】:Why cannot call method in org.freedesktop.NetworkManager with dbus in Python?为什么不能在 Python 中使用 dbus 调用 org.freedesktop.NetworkManager 中的方法? 【发布时间】:2012-11-24 14:22:43 【问题描述】:我在交互式 python shell 中尝试了下面的代码,并在代码的第 3 行得到了以下错误,使用 D-Feet 我看到总线中存在路径和接口,并且使用命令 dbus-send 我能够获取设备,请参阅此消息的末尾。为什么不在 python 中使用此代码? PS:我用的是ubuntu 12.04,在ubuntu 11也试过,同样的问题。
代码:
import dbus
bus = dbus.SessionBus()
obj = bus.get_object('org.freedesktop.NetworkManager', '/org/freedesktop/NetworkManager')
t = dbus.Interface(obj, "org.freedesktop.NetworkManager")
t.GetDevices()
输入代码第3行输出错误:
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/usr/lib/pymodules/python2.7/dbus/bus.py", line 244, in get_object
follow_name_owner_changes=follow_name_owner_changes)
File "/usr/lib/pymodules/python2.7/dbus/proxies.py", line 241, in __init__
self._named_service = conn.activate_name_owner(bus_name)
File "/usr/lib/pymodules/python2.7/dbus/bus.py", line 183, in activate_name_owner
self.start_service_by_name(bus_name)
File "/usr/lib/pymodules/python2.7/dbus/bus.py", line 281, in start_service_by_name
'su', (bus_name, flags)))
File "/usr/lib/pymodules/python2.7/dbus/connection.py", line 630, in call_blocking
message, timeout)
DBusException: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.NetworkManager was not provided
by any .service files
有效的Shell命令:
dbus-send --system --print-reply --reply-timeout=2000 --type=method_call --dest=org.freedesktop.NetworkManager /org/freedesktop/NetworkManager org.freedesktop.NetworkManager.GetDevices
输出:
method return sender=:1.2 -> dest=:1.69 reply_serial=2
array [
object path "/org/freedesktop/NetworkManager/Devices/0"
]
这只是一个例子,我想知道为什么不起作用,如果我将第 3 行更改为(注意第一个参数中的 DBus 名称):
obj = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/NetworkManager')
错误没有发生,但是在这个接口中GetDevices方法不存在。
【问题讨论】:
【参考方案1】:在您的命令行示例中,您要求使用系统总线:
dbus-send --system ...
在您的 Python 代码中,您要求会话总线:
bus = dbus.SessionBus()
如果你通过系统总线尝试请求,我想你会发现它有效:
>>> import dbus
>>> bus = dbus.SystemBus()
>>> obj = bus.get_object('org.freedesktop.NetworkManager', '/org/freedesktop/NetworkManager')
>>> t = dbus.Interface(obj, "org.freedesktop.NetworkManager")
>>> t.GetDevices()
dbus.Array([dbus.ObjectPath('/org/freedesktop/NetworkManager/Devices/0'), dbus.ObjectPath('/org/freedesktop/NetworkManager/Devices/1')], signature=dbus.Signature('o'))
>>>
【讨论】:
谢谢!你说得对,我是 dbus 的新手,以前没用过,非常感谢!以上是关于为啥不能在 Python 中使用 dbus 调用 org.freedesktop.NetworkManager 中的方法?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我不能在 python 中调用 HDIO_GETGEO?