为什么io_add_watch()回调收到错误的IOChannel对象?

时间:2019-02-16 03:17:45

标签: python pygtk glib

据我从可用文档中得知,GLib.io_add_watch()应该注册一个在IOChannel上发生条件时要调用的函数,而callback function应该以如下方式接收该IOChannel:它的第一个论点。很好,但事实并非如此。 GLib将完全不同的IOChannel对象传递给回调。为什么?

换句话说,为什么这段代码会产生AssertionError?

#!/usr/bin/env python3

import gi
from gi.repository import GLib

_, _, fd, _ = GLib.spawn_async(['/bin/echo', 'hello'], standard_output=True)

channel = GLib.IOChannel.unix_new(fd)

def on_read(callback_channel, condition):
    assert callback_channel is channel

GLib.io_add_watch(channel, GLib.PRIORITY_DEFAULT, GLib.IO_IN, on_read)

GLib.MainLoop().run()

1 个答案:

答案 0 :(得分:1)

IOChannel是一个GBoxed结构,而不是GObject。它没有身份,并通过副本传递。回叫中收到的内容与您给出的相同,但它们不是同一对象,它们的所有字段都将具有相同的值。