Electron+Python软件系统开发记录(一):基础环境搭建

南笙酒味 提交于 2019-12-20 04:48:57

Electron+Python软件系统开发记录(一):基础环境搭建

1.问题说明

    最近开始做本科毕设,其中有一部分内容是搭建一个完整的软件系统。系统要求就是常见的客户端,服务器,数据库的整体架构。因为本科不是计算机系的,所以学习的相关技能少,以前写课程设计一般用QT或者MFC,还有Mac的OC语言。本着多学习的态度,这次选用了Electron框架,可以迫使自己学学html,css,js这些东西。后端因为需要大量数据处理和深度学习,因此采用python。这个文档会持续更新,记录自己的系统开发过程。

2.框架简介

    Electron是用js,html,css开发客户端APP的框架。我的理解就是给网页套了个壳,打开桌面软件好像打开了一个chorme一样。

3.通信方式选择

    经过调研,发现网上的Electron+python程序实现前后端通信的方式主要有三种:

  1. http
  2. zerorpc
  3. thrift
        这里的通信是指桌面端前端和本地后台的通信,用http不太合适,也太笨重了。
        跟着网上的demo搞了一天zerorpc这个方式,最后也没成功。大概看了一下,zerorpc其中的依赖zeromq好像已经停止更新维护了。并且其存在很多版本问题,报错说需要abi编号为75的node.js版本,但是我去官网看,最新的一些版本都是79(我用的node12.13.1),再往前是72,没有75的,所以我就放弃了zerorpc。
        后来我发现了thrift,Thrift是一种接口描述语言和二进制通讯协议,它被用来定义和创建跨语言的服务。它被当作一个远程过程调用(RPC)框架来使用,是由Facebook为“大规模跨语言服务开发”而开发的。很遗憾没有对它进行深入了解,不过用这个比较简单地就把通信demo跑通了。

4.thrift使用

    使用Thrift通信首先需要在两端都安装依赖库:

pip install thrift
npm install thrift

    然后写一个自己的python端的server

import json
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer

from gen_py.test import userService


class Test:

    def test1(self, dic):
        print("one")
        dic = json.loads(dic)
        #dic.name = dic.name + "From Pyhton"
        return f'PPPPPPPPPP, {dic["name"]}!'

    def log_test(self, info):
        print("收到账户密码验证")
        info = json.loads(info)
        if info["name"] == "zhangrl" and info["password"] == "1234":
            return '1'
        else:
            return '0'

if __name__ == "__main__":
    port = 8000
    ip = "127.0.0.1"
    # 创建服务端
    handler = Test()  # 自定义类
    processor = userService.Processor(handler)  # userService为python接口文件自动生成
    # 监听端口
    transport = TSocket.TServerSocket(ip, port)  # ip与port位置不可交换
    # 选择传输层
    tfactory = TTransport.TBufferedTransportFactory()
    # 选择传输协议
    pfactory = TBinaryProtocol.TBinaryProtocolFactory()
    # 创建服务端
    server = TServer.TThreadedServer(processor, transport, tfactory, pfactory)
    print("start server in python")
    server.serve()
    print("Done") 

在Electron(其实是nodejs)中写一个client,在electron中我理解就是渲染进程吧,实现通信,里面导入的文件先不用管,马上就说:

var thrift = require('thrift');
var userService = require('./gen-nodejs/userService.js');
var ttypes = require('./gen-nodejs/test_types.js');
var thriftConnection = thrift.createConnection('127.0.0.1', 8000);
var thriftClient = thrift.createClient(userService,thriftConnection);

thriftConnection.on("error",function(e)
{
    console.log(e);
});

const {BrowserWindow} = require('electron').remote

let name = document.querySelector('#name')
let result = document.querySelector('#result')

name.addEventListener('input', () => {
  var dic = {name: name.value}
  dic = JSON.stringify(dic)
  thriftClient.test1(dic, (error, res) => {
    if(error) {
      console.error(error)
    } else {
      result.textContent = res
    }
  })
})
name.dispatchEvent(new Event('input'))

上面是代码层面,真正在项目中运行起来还缺少很多东西,在WIN10下你需要:

  1. 去thrift的github下载exe程序
  2. 定义一个接口文件 比如 “test.thrift"
service userService {
    string test1(1:string name);
    string log_test(1:string info);
}

3.终端执行thrift文件

thrift --gen js:node test.thrift
thrift -r --gen py test.thrift

这样会自动生成两个文件夹 gen-nodejs & gen-py(我这里需要改名为gen_py才能用),这样上述代码中就能使用它们了。

5. 运行简单demo

我跑的是这个大哥的demo。运行过后能成功就可以了,如果有什么问题,就打开开发者工具自己调吧。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!