2

インタラクティブなPythonシェルで以下のコードを試し、コードの3行目でフォローエラーが発生しました。D-Feetを使用すると、パスとインターフェイスがバスに存在することがわかります。コマンドdbus-sendを使用すると、デバイスを取得できます。このメッセージの終わり。Pythonでこのコードを使ってみませんか?PS:私はubuntu 12.04を使用していますが、ubuntu11でも同じ問題を試しました。

コード:

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

動作するシェルコマンド:

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メソッドは存在しません。

4

1 に答える 1

5

コマンドラインの例では、システムバスを求めています:

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'))
>>> 
于 2012-12-06T14:35:15.397 に答える