【发布时间】:2012-09-15 08:59:34
【问题描述】:
我正在使用gobject.spawn_async 创建一个异步子进程,它会在标准输出上生成我想在子进程退出时使用的数据。所以我创建了两个回调(最小的例子):
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 中重新分配。现在的问题是,我如何以一种语法上很好且可读(即自我记录)的方式来做到这一点?当然,我可以在child_done 中读取output,但是child_watch_add 调用不会记录回调中使用了哪些数据。加上回调不能用于其他任何事情。我真的在这里缺少 C/C++ 指针语义,因为这正是我想要的。
我也知道我可以创建一个模拟指针语义的 wapper 类,但这也有点使语法膨胀。那么,是否有任何建议以一种美观且易读的方式执行此“pythonic”,即优雅?
【问题讨论】:
标签: python asynchronous callback glib pygobject