使用回调传递数据

时间:2012-09-23 20:18:08

标签: python asynchronous callback glib pygobject

我正在使用gobject.spawn_async创建一个异步子进程,它会在子进程退出时生成我想要使用的stdout数据。所以我创建了两个回调(最小例子):

output = ""
def child_read(source, cb_condition):
    for line in source: output += line + "\n"

def child_done(pid, condition, user_data):
    print(user_data)

cpid, cout = gobject.spawn_async(['/bin/ls'],
                      flags = gobject.SPAWN_DO_NOT_REAP_CHILD,
                      standard_output=True)
gobject.child_watch_add(pid=cpid, function=child_done, data=output)
gobject.io_add_watch(os.fdopen(cout, 'r'), gobject.IO_IN | gobject.IO_PRI, child_read)

这里明显的缺陷是child_done将始终打印,因为在output中重新分配了child_read。现在的问题是,我如何以语法上可爱和可读(即自我记录)的方式做到这一点?当然,我可以在output中阅读child_done,但child_watch_add调用不会记录回调中使用的数据。此外,回调不能用于其他任何事情。我在这里真的缺少C / C ++指针语义,因为那样就可以做到我想要的。

我也知道我可以创建一个模拟指针语义的wapper类,但是那种语法也会膨胀。那么,有什么建议以一种漂亮可读的方式做这个“ pythonic ”,即优雅

1 个答案:

答案 0 :(得分:0)

我没有使用过gobject,但是对于一个Python问题来说四个小时很长时间没有得到答案,所以我会试一试。

使output成为字符串列表而不是字符串。这样的事情,也许是:

output = []

def child_read(source, cb_condition):
    output.extend(source)

def child_done(pid, condition, user_data):
    output_str = '\n'.join(user_data)
    print(output_str)

其余代码未更改(即在data=output的调用中仍然使用child_watch_add()