【问题标题】:Q: KDB+/PyQ publisher subscriber with feeds in python objects问:KDB+/PyQ 发布者订阅者使用 python 对象中的提要
【发布时间】:2018-07-11 16:25:34
【问题描述】:

我一直在尝试重现发布者订阅者示例: 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 端执行此操作有一些指示?有什么例子吗?

非常感谢, 耶尔·达蒙

【问题讨论】:

  • 你提到一个 websocket 解决方案“会很出色”——你可以看看这个 repo:github.com/jonathonmcmurray/ws.q wsu.q & wschaintick.q 提供了创建 WebSocket 链式自动收报机的框架,本质上是重新发布通过 websockets。自述文件底部的示例
  • 您好 Jonathon,非常感谢您的回答。可悲的是,我在这里提出的困难首先是能够在 python 对象中获得我的结果。我可以在你的 git repo 中看到我正在寻找的重要部分是在 node js 中。你知道python中有一个类似的客户端吗?在此先感谢,耶尔
  • node.js 只是一个例子。任何可以充当 websocket 客户端和解析 JSON(肯定涵盖 python)的语言都可以替代。在那个 repo 中没有任何依赖于 node.js 的东西。综上所述,在 PyQ 中更直接地做一些事情而不是依赖 websockets 可能会更好地提高性能
  • 无法找到任何适用于 python 的客户端示例。同样在 kx 网站上,有 node js 和 java 示例,但没有 python 示例。我试图适应它但没有成功。但是是的,最后我想要在 PyQ 中更直接的东西,你是对的

标签: python jupyter-notebook kdb pyq


【解决方案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”fixture。

【讨论】:

  • 嗨,亚历山大,感谢您的回答。我确实尝试了您在 github.com/KxSystems/pyq/blob/master/src/ipy/Magic.ipynb 的“捕获由 q 写入标准流的输出”中所建议的内容。可悲的是,它没有成功。最好的,耶尔
  • 请在 Github 上打开一个问题并更详细地描述您的问题。谢谢。
  • 我不确定重定向输出是否足够,我希望它在 python 对象中
  • @AlexanderBelopolsky 是否可以从任何其他 Python 代码中导入用 PyQ 编写的方法?由于 PyQ 使用不同的解释器(不是 Python)运行。
  • 是的,import 语句在 PyQ 中照常工作。
猜你喜欢
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-14
  • 1970-01-01
相关资源
最近更新 更多