3

私は既存の C プロジェクトの Python クローンに取り組んでいます。C プロジェクトはカスタム DBus に接続し、そこでコールバックを取得するためのオブジェクトを提供します。

基本的には次のコードで Python を使用してこれを複製しようとしました。

def vtable_method_call_cb(connection, sender, object_path, interface_name, method_name, parameters, invocation, user_data):
    print('vtable_method_call_cb: %s' % method_name)

connection = Gio.DBusConnection.new_for_address_sync(
    "unix:abstract=gstswitch",
    Gio.DBusConnectionFlags.AUTHENTICATION_CLIENT,
    None,
    None)

node_info = Gio.DBusNodeInfo.new_for_xml(introspection_xml)

vtable = Gio.DBusInterfaceVTable()
vtable.method_call(vtable_method_call_cb)
vtable.get_property(None)
vtable.set_property(None)

connection.register_object(
    "/info/duzy/gst/switch/SwitchUI",
    node_info.interfaces[0],
    vtable,
    None,
    None)

呼び出しで vtable を作成するときにコードが失敗しvtable.method_callます (ただしget_property、1 つの呼び出しをコメントアウトすると失敗します)、次のログ/トレースバック:

** (process:18062): WARNING **: Field method_call: Interface type 2 should have is_pointer set
Traceback (most recent call last):
  File "moo.py", line 69, in <module>
    vtable.method_call(vtable_method_call_cb)
RuntimeError: unable to get the value

Python で使用しているコードを見つけることができなかったregister_object()ので、Gio のこの部分を使用できるかどうか、または完全ではないかどうかはわかりません。

4

1 に答える 1

3

これは確かに聞きたいことではありませんが、GDBus Python バインディングで4 年前のバグに遭遇し、バスにオブジェクトを登録できなくなりました。かなり前にパッチが提案されていましたが、実際にリリースされるように見えるたびに、何人かの GNOME 開発者が気に入らない点を見つけ、新しいパッチが提案されました...そして何も起こりませんでした。翌年のほとんど。このサイクルはすでに3回発生しており、すぐに壊れるという希望があるかどうかはわかりません...

基本的に、GNOME 開発者自身は多かれ少なかれ、この問題が最終的に修正されるまで dbus-python を使用することを提案しているので、代わりにここに向かうべきだと思います。:-/

ところで:ソースコードが間違っていると思います(どちらの方法でも機能しないという事実は別として)。VTable を作成するには、実際には次のように記述します。

vtable = Gio.DBusInterfaceVTable()
vtable.method_call  = vtable_method_call_cb
vtable.get_property = None
vtable.set_property = None

しかし、バインディングが壊れているので、abort()ここで例外を取引しているだけです... :-(

パッチが実際にpython-gi現在の形式になった場合、vtable完全にダンプされ (YEAH!)、connection.register_objectcall は次のようになります。

connection.register_object_with_closures(
    "/info/duzy/gst/switch/SwitchUI",
    node_info.interfaces[0],
    vtable_method_call_cb, # vtable.method_call
    None,                  # vtable.get_property
    None)                  # vtable.set_property

アップデート

これがついに修正されたようです!以下を使用してオブジェクトをエクスポートできるようになりましたg_dbus_connection_register_object_with_closures

def vtable_method_call_cb(connection, sender, object_path, interface_name, method_name, parameters, invocation, user_data):
    print('vtable_method_call_cb: %s' % method_name)

connection = Gio.DBusConnection.new_for_address_sync(
    "unix:abstract=gstswitch",
    Gio.DBusConnectionFlags.AUTHENTICATION_CLIENT,
    None,
    None)

node_info = Gio.DBusNodeInfo.new_for_xml(introspection_xml)

connection.register_object(
    "/info/duzy/gst/switch/SwitchUI",
    node_info.interfaces[0],
    vtable_method_call_cb,
    None,
    None)
于 2015-02-16T23:11:02.077 に答える