Skip to main content
 首页 » 编程设计

python之通过回调传递数据

2025年05月04日9myhome

我正在使用 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。