2

我正在创建一个异步子进程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. 现在的问题是,我如何以一种语法上很好且可读(即自我记录)的方式来做到这一点?当然,我可以直接读outputchild_done,但是child_watch_add调用并没有记录回调中使用了哪些数据。加上回调不能用于其他任何事情。我真的在这里缺少 C/C++ 指针语义,因为这正是我想要的。

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

4

1 回答 1

0

我没有使用过 gobject,但是对于一个 Python 问题在 SO 上仍未得到解答,四个小时是很长的时间,所以我会试一试。

制作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().

于 2012-09-24T00:39:28.553 回答