Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将RxPy数据流发送到前端javascript_Javascript_Python_Electron_Rx Py - Fatal编程技术网

如何将RxPy数据流发送到前端javascript

如何将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 ReactiveX流(使用RxPy库)发送到Web UI组件上的javascript,但似乎找不到这样做的方法。此外,我可能需要将进入Javascript的数据流转换为RxJS可观察的类型,以便进一步处理。 你能帮我理解如何做到这一点吗? 我仍然掌握着ReactiveX,所以可能有一些基本概念我还没有掌握,但我正在努力在网上找到类似的东西

这个问题是在我正在开发一个桌面应用程序时出现的,该应用程序从csv或zeromq端点获取数据,并将其流式传输到一个UI,在该UI中,数据将被动态打印(随着新数据的到来,打印会被更新)。我正在使用Electron构建我的应用程序,使用python作为我的后端代码。Python是必须的,因为我将用一些TensorFlow模型扩展应用程序

作为初始结构,我已经编写了一些示例代码来使用,但似乎无法使其正常工作。 我设法从UI按钮一直到python脚本,但是我被PricesApi.get_stream(…)方法的返回卡住了

index.html 前端是直的


电子应用
触发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库”)。它绝对的简单和直观让我用几句简单的话就能实现我想要的

  • 按照介绍了解布局
  • 然后,您的主python文件(我方便地将其命名为main.py)将流函数公开给eel,这样就可以从JS文件调用它,并将流导入JS文件公开的JavaScript“receive_price”函数 导入系统 进口接收 从csv导入DictReader def prepare_csv_timeseries_流(文件名): 返回rx.from(DictReader(打开(文件名'r')) def process_logic(): 回流管( ops.map(lambda p:print(p)),#仅用于查看正在通过的内容 ops.map(lambda p:eel.receive_price(p)),JS文件中通过eel公开的#键函数针对每个价格调用。 ) @expose#Decorator,以便可以从JavaScript触发此函数 def流(文件名): price\u observable=prepare\u csv\u timeseries\u流(文件名) price_observable.pipe(process_logic()).subscribe()#应用管道并订阅触发器流 eel.init('web') eel.start('main.html')#看看这是多么美丽和优雅!
  • 现在,我们创建price_processing.js文件(按照Eel说明放置在“web”文件夹中)以合并公开的函数
  • 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函数来启动流。
    })
    
  • 除了更改脚本refs:/eel.js之外,HTML几乎保持不变,如