2023-10-16 node.js-调用python-记录

NodeJS 作为后端,仅在需要时调用 Python

在某些特殊的场景下,比如复杂耗时的数据处理和运算时,我们可以用 Python 脚本编写,然后使用 Node 的子进程调用 Python 脚本即可,这样可以提升效率。如下代码,我们可以使用 Node.js 的 API child_process.spawn(command[, args][, options]) 进行调用 Python 脚本:

javascript 复制代码
const spawn = require('child_process').spawn
app.get("process_data", (req, res) => {
    spawn('python3', ['script.py'])
})

Python 脚本:

script.py

doSometing()

如果我们的 Node 脚本向 Python 脚本传递参数,那该怎么传呢,如下段代码所示:

javascript 复制代码
const spawn = require('child_process').spawn
app.get("process_data", (req, res) => {
    const msg = "Hello"
    spawn('python3', ['script.py', msg])
})

这时我们需要改下 Python 的脚本,接收 NodeJS 传过的参数。如下段代码所示:

python 复制代码
import sys, json
 
def main():
    msg = sys.argv[1]
    doSometing(msg)
 
if __name__ == '__main__':
    main()

如果传输 JSON 这样复杂的数据,我们需要改写 Node 的写法,以数据流的形式传递给 Python ,示例代码如下:

javascript 复制代码
const spawn = require('child_process').spawn,
const py = spawn('python3', ['script.py'])
const data = {
    msg: "Hello"
}
 
py.stdin.write(JSON.stringify(data)) 
//we have to send data as a string, so we are using JSON.stringify
py.stdin.end()

接下来我们来改下 Python 脚本,接收 Node 前端传送的数据流,进行下一步的逻辑处理

python 复制代码
import sys, json
 
def main():
    lines = sys.stdin.readlines()
    data = json.loads(lines)
    doSometing(data['msg'])
 
if __name__ == '__main__':
    main()

Node 除了可以往 Python 传递数据,同时可以接收 Python 传递的数据,接下来我们来改写 Node 相关的脚本,示例代码如下:

javascript 复制代码
const spawn = require('child_process').spawn
const py = spawn('python3', ['cscript.py'])
 
py.stdout.on('data', function(res){
   let data = JSON.parse(res.toString())
   console.log(data)
})
相关推荐
CaracalTiger2 小时前
什么是Clawdbot?Clawdbot下载、安装、配置教程(最新版Moltbot)
python·编辑器·aigc·idea·ai编程·intellij idea·agi
星火开发设计2 小时前
枚举类 enum class:强类型枚举的优势
linux·开发语言·c++·学习·算法·知识
WJX_KOI6 小时前
Open Notebook 一个开源的结合AI的记笔记软件
python
喜欢吃燃面7 小时前
Linux:环境变量
linux·开发语言·学习
0思必得07 小时前
[Web自动化] 反爬虫
前端·爬虫·python·selenium·自动化
徐徐同学7 小时前
cpolar为IT-Tools 解锁公网访问,远程开发再也不卡壳
java·开发语言·分布式
LawrenceLan7 小时前
Flutter 零基础入门(二十六):StatefulWidget 与状态更新 setState
开发语言·前端·flutter·dart
2301_822382767 小时前
Python上下文管理器(with语句)的原理与实践
jvm·数据库·python
m0_748229997 小时前
Laravel8.X核心功能全解析
开发语言·数据库·php
喵手8 小时前
Python爬虫实战:从零搭建字体库爬虫 - requests+lxml 实战采集字体网字体信息数据(附 CSV 导出)!
爬虫·python·爬虫实战·零基础python爬虫教学·csv导出·采集字体库数据·字体库字体信息采集