定制开发小程序Nodejs调用python的几种方案

nodejs可以使用JavaScript进行后端,同时使用electron定制开发小程序可以开发桌面应用,定制开发小程序可以说是相当强大。如果要在nodejs定制开发小程序中读取本地文件则可以使用fs模块进行,ffi定制开发小程序模块可以调用C定制开发小程序开发的动态库,定制开发小程序也可以实现更多的本地化操作,但是C开发动态库难度比较大成本比较高,这时候可以考虑使用python代替。python可以说是相当简单,它的库非常丰富,几乎可以满足你能想到的需求,因此python代替C库开发是不错的选择,下面介绍几种nodejs调用python的方法。

一、child_process子进程执行python

这种方案是nodejs提供的子进程解决方案,就是新建一个进程然后通过标准输入输出进行通信。在创建子进程时child_process底层创建两个pipe管道进行进程通信,相当于管道是nodejs主进程向python子进程发送消息,一个是python子进程向nodejs主进程发送消息。

const { spawn } = require('child_process');const process = spawn('cmd');// 执行python程序process.stdin.write(`python ${__dirname}/py_scripts/main.py`)// 接收子进程标准输出process.stdout.on('data', function (data){  console.log(data.toString());});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

这种方式执行python脚本不能传输中文字符,读取python的标准输出不是即时的,而是会一次读取多个结果,比如python的print输出十个a,一次读取可能读取到5个a,第二次再读取5个a,虽然不是即时通信,但是因为是pipe通信所以不会漏读消息。还有另一个问题是任务管理器中会显示一个cmd或者bash的进程,linux中bash输入的命令或内容通过日志文件可以查看nodejs与python通信的内容。

二、python创建服务器使用网络通信

这种方案是python使用模块创建服务器应用,开启服务器后就可以通过地址进行访问。nodejs中请求http://127.0.0.1:8080/home/hello连接,然后python返回一个json数据,nodejs解析json即可完成通信。这种方式基于http网络通信,只能nodejs主动请求,python不能主动发送消息给nodejs。

from flask import Flask, request, redirect, url_for, render_template# 创建Flask服务app = Flask(__name__)# 访问URL:http://127.0.0.1:8080/home/hello# 返回结果:{"data":"welcome to use flask.","msg":"hello"}@app.route('/home/<name>')def home(name):    return {        "msg": name,        "data": "welcome to use flask."    }if __name__ == "__main__":    # 启动Flask服务,指定主机IP和端口    app.run(host='127.0.0.1', port=8080)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

三、使用nodejs的pycore模块

PyCore是NodeJs的npm模块,通过PyCore可以实现JavaScript与Python的交互,可以利用libuv线程池以及异步特性提高开发和执行的效率。因为是嵌入python所以是底层v8与python直接通信,JavaScript可以同步或异步执行Python语句和调用Python函数;在Python中同样可以执行JavaScript语句和调用JavaScript的函数。

优点

  • 不创建新进程执行python
  • 为python引入异步编程
  • 可使用python虚拟环境
  • python中可执行JavaScript脚本
  • JavaScript中可执行python脚本
  • Python可以直接操作electron的DOM元素

快速上手

这是快速创建pycore的应用,包括在nodejs中使用和中使用。

安装npm包

npm install pycore
  • 1

index.js

const pycore = require('pycore')// PyCore初始化// 根据本机器的python3.10安装路径来配置环境pycore.init({    "python_version":"3.10",    "python_home":"C:/Users/Admin/.pyenv/pyenv-win/versions/3.10.6",    "program_name":"python",    "base_prefix":"C:/Users/Admin/.pyenv/pyenv-win/versions/3.10.6",    "base_exec_prefix":"C:/Users/Admin/.pyenv/pyenv-win/versions/3.10.6",    "base_executable":"C:/Users/Admin/.pyenv/pyenv-win/versions/3.10.6/python.exe",    "prefix":"pyscript/venv",    "exec_prefix":"pyscript/venv",    "executable":"pyscript/venv/Scripts/python.exe",    "pythonpath_env":"pyscript/venv/Lib/site-packages",    "module_search_paths":["./", "pyscript"],    "encoding":"utf-8"});// Python调用的JS函数// 必须是name = function(){}或者name = () => {}方式定义函数,否则无法在Python调用sayHello = function (num1, num2) {    let total = num1 + num2;    console.log('Main SayHello total:' + total);    return ++total;}// 执行Python语句pycore.runScriptSync("print('main run pyscript')");pycore.runScript("print('main run pyscript')");// 创建Python模块对象const pyApp = pycore.import('app');// 同步调用Python函数let res = pyApp.callSync('sum', [1, 9]);console.log(res);// 异步调用Python函数pyApp.call('callJS', [2, 6],    function (data) {        console.log(data);    },    function (error) {        console.log(error);    });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

app.py

import pycoredef sum(num1, num2):    return num1 + num2def callBack(data):    pycore.runScript("console.log('callBack data:" + str(data) + "');")    return data # 该函数return返回值,在JS中为空的JS回调函数接收,将不会有任何操作def callJS(num1, num2):    state = pycore.callJS(target='sayHello', args=(num1, num2), callback=(__name__, 'callBack')) # 返回0表示失败,1为成功    return num1 + num2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发