python - 通过回调传递数据

标签 python asynchronous callback glib pygobject

我正在使用 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 将始终不打印任何内容,因为 outputchild_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/

相关文章:

python - 如何改变NLTK中朴素贝叶斯分类器的平滑方法?

asynchronous - 如何在不使用 tokio::spawn 的情况下循环运行多个 Tokio 异步任务?

c# - C# 回调函数不是从 C++ 代码调用的

python - 关于 Python Pandas,删除该行

python - 使用 sleep() 时高效快速的 Python While 循环

Python将列表附加到数据框列

javascript - Node.js:识别脚本是异步的还是非阻塞的

.net - System.Net.Sockets.NetworkStream的异步读取回调

rest - 为长期任务创建 REST API 的最佳方式?

c++ - 实例化具有回调函数类型的模板