如何将RxPy数据流发送到前端javascript
我试图将python ReactiveX流(使用RxPy库)发送到Web UI组件上的javascript,但似乎找不到这样做的方法。此外,我可能需要将进入Javascript的数据流转换为RxJS可观察的类型,以便进一步处理。 你能帮我理解如何做到这一点吗? 我仍然掌握着ReactiveX,所以可能有一些基本概念我还没有掌握,但我正在努力在网上找到类似的东西 这个问题是在我正在开发一个桌面应用程序时出现的,该应用程序从csv或zeromq端点获取数据,并将其流式传输到一个UI,在该UI中,数据将被动态打印(随着新数据的到来,打印会被更新)。我正在使用Electron构建我的应用程序,使用python作为我的后端代码。Python是必须的,因为我将用一些TensorFlow模型扩展应用程序 作为初始结构,我已经编写了一些示例代码来使用,但似乎无法使其正常工作。 我设法从UI按钮一直到python脚本,但是我被PricesApi.get_stream(…)方法的返回卡住了 index.html 前端是直的如何将RxPy数据流发送到前端javascript,javascript,python,electron,rx-py,Javascript,Python,Electron,Rx Py,我试图将python ReactiveX流(使用RxPy库)发送到Web UI组件上的javascript,但似乎找不到这样做的方法。此外,我可能需要将进入Javascript的数据流转换为RxJS可观察的类型,以便进一步处理。 你能帮我理解如何做到这一点吗? 我仍然掌握着ReactiveX,所以可能有一些基本概念我还没有掌握,但我正在努力在网上找到类似的东西 这个问题是在我正在开发一个桌面应用程序时出现的,该应用程序从csv或zeromq端点获取数据,并将其流式传输到一个UI,在该UI中,数据
电子应用
触发Python代码
api.py:
ZeroRPC服务器文件与上述链接中的文件类似
import gevent
import json
import signal
import zerorpc
from core_operator import stream
class PricesApi(object):
def get_stream(self, filename):
return stream(filename)
def stop(self):
print('Stopping strategy.')
def echo(self, text):
"""echo any text"""
return text
def load_settings():
with open('settings.json') as json_settings:
settings_dictionary = json.load(json_settings)
return settings_dictionary
def main():
settings = load_settings()
s = zerorpc.Server(PricesApi())
s.bind(settings['address'])
print(f"Initialising server on {settings['address']}")
s.run()
if __name__ == '__main__':
main()
core_operator.py
这是从zeroMQ订阅获取价格的主要逻辑所在的文件,但目前只是从csv创建一个可观察的
导入系统
进口接收
从csv导入DictReader
def prepare_csv_timeseries_流(文件名):
返回rx.from(DictReader(打开(文件名'r'))
def流(文件名):
price\u observable=prepare\u csv\u timeseries\u流(文件名)
可观察的回报价格
rendered.js
最后,应该接收流的javascript:
const zerorrpc=require('zerorrpc');
常量fs=require('fs')
const settings_block=JSON.parse(fs.readFileSync('./settings.JSON').toString());
让client=new zerorpc.client();
client.connect(设置块['address']);
let button=document.querySelector(“#超级按钮”);
让pyOutput=document.querySelector(“#py output”);
让文件名=“%path to file%”
按钮。addEventListener('单击',()=>{
让第_至_行写入='1'
console.log('按钮单击已接收')
invoke('get_stream',filename,(错误,结果)=>{
var消息=pyOutput;
message=document.createElement('li'),
内容=document.createTextNode(error.data);
message.appendChild(内容);
messages.appendChild(message);
如果(错误){
控制台错误(error);
}否则{
var消息=pyOutput;
message=document.createElement('li'),
内容=document.createTextNode(result.data);
message.appendChild(内容);
messages.appendChild(message);
}
})
})
我一直在研究如何使用WebSocket,但未能理解如何实现它。我确实找到了一些使用Tornado服务器的例子,但是我试图保持它尽可能的纯净,而且,由于已经有了来自Electron的客户机/服务器结构,我觉得很奇怪,我无法直接使用它。
此外,我还试图将整个系统保持为一个推式结构,因为数据需求不允许使用拉式模式,包括常规轮询等
非常感谢您能抽出时间来做这件事,如果您需要任何进一步的详细信息或解释,请告诉我。我通过使用找到了一个解决方案(被描述为“制作简单的电子HTML/JS GUI应用程序的小Python库”)。它绝对的简单和直观让我用几句简单的话就能实现我想要的
let button=document.querySelector(“#超级按钮”);
让pyOutput=document.querySelector(“#py output”);
让文件名=“%path to file%”
log(“准备接收数据!”)
鳗鱼。暴露(接受价格);//将函数公开给Python,以处理每个价格
函数接收价格(结果){
var消息=pyOutput;
message=document.createElement('li');
内容=document.createTextNode(结果);
message.appendChild(内容);
messages.appendChild(message);
//在这里,您可以为处理数据添加更多功能,例如日志、图表等。。
};
按钮。addEventListener('单击',()=>{
log('按钮点击得非常好!做得非常好')
stream(filename);//调用通过eel公开的Python函数来启动流。
})