我正在使用 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
中重新分配。现在的问题是,我如何以一种语法上漂亮且可读(即 self 记录)的方式来做到这一点?当然,我可以只读取 child_done
中的 output
,但是 child_watch_add
调用不会记录回调中使用了哪些数据。另外,回调不能用于任何其他用途。我在这里真的缺少 C/C++ 指针语义,因为那正是我想要的。
我还知道我可以创建一个模拟指针语义的 wapper 类,但这也有点膨胀语法。那么,有没有关于以一种漂亮且可读的方式优雅地来实现这种“pythonic”的建议?
最佳答案
我没有使用过 gobject,但是四个小时对于 Python 问题在 SO 上仍然没有答案来说已经很长了,所以我会试一试。
使输出
成为字符串列表而不是字符串。可能是这样的:
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)
其余代码保持不变(即在调用 child_watch_add()
时仍然使用 data=output
。
关于python - 通过回调传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12555915/