繁体   English   中英

为什么不能在Python中使用dbus调用org.freedesktop.NetworkManager中的方法?

[英]Why cannot call method in org.freedesktop.NetworkManager with dbus in Python?

我在交互式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不存在。

在您的命令行示例中,您需要系统总线:

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'))
>>> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM