2

我一直在尝试重现发布者订阅者示例: https ://code.kx.com/wiki/Cookbook/publishsubscribe

就纯粹与 q 相关的情况而言,一切正常。

我一直在尝试使用 PyQ 内核在 jupyter notebook 中重现订阅者。我没有成功地在 python 对象中获取订阅者输出/提要。每次,订阅者都会在内核输出(控制台)中打印。

我也一直在尝试在 PyQ 中复制类似于我在 java 客户端上看到的类似 q 的内容,但没有取得多大成功(https://code.kx.com/q/interfaces/java-client-for-q/ )

我理想地想要实现的是:

  • 在命令行中运行我的发布者(到目前为止,这是非常简单的部分)
  • 有一个 python 笔记本,它监听我的发布者发布的端口,并在新提要进入时处理事件
  • websocket 解决方案将非常出色

有没有人有一些关于如何在 python 端做到这一点的指示?有什么例子吗?

非常感谢,耶尔达蒙

4

1 回答 1

1

为了将 q 输出重定向到 Jupyter 笔记本,您应该为 %%q 单元魔术指定 -1(对于标准输出)和 -2(对于标准错误)选项。

我想要它在一个 python 对象中

您可以通过将标准流重定向到管道来捕获它们。例如,在 Linux 上,您可以这样做

>>> import os
>>> r,w = os.pipe()
>>> q('\\2 /dev/fd/%d' % w)
k('::')
>>> q('-2 "hello"')
k('-2')
>>> os.read(r, 5)
b'hello'

请注意,我使用 stderr 进行说明,因为重定向 stdout 会干扰 REPL 显示,但同样的技术适用于 stdout。使用管道的常见警告适用。管道的缓冲区有限,因此您需要安排定期读取。通常,这将涉及某种超出此答案范围的事件管理。如果您不想处理这种复杂性,最好的办法是使用临时文件而不是管道。我还建议研究如何在 pytest 中实现“fdcap”夹具。

于 2018-07-13T00:20:44.593 回答