我正在创建一个异步子进程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
. 现在的问题是,我如何以一种语法上很好且可读(即自我记录)的方式来做到这一点?当然,我可以直接读output
入child_done
,但是child_watch_add
调用并没有记录回调中使用了哪些数据。加上回调不能用于其他任何事情。我真的在这里缺少 C/C++ 指针语义,因为这正是我想要的。
我也知道我可以创建一个模拟指针语义的 wapper 类,但这也有点膨胀语法。那么,有什么建议可以以一种漂亮且易读的方式来做这个“ pythonic ”,即优雅地吗?