我正在使用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 ”,即优雅?
答案 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()
。