首页与我联系

「基础」如何在 NodeJS 调用 Python ?

By 前端达人
Published in 1-JavaScript
August 24, 2022
1 min read
「基础」如何在 NodeJS 调用 Python ?

今天看了一篇文章觉得很有趣,没想到 NodeJS 也能调用 Python,众说周知,Python 语言这几年红的不得了,在结合当今流行的 JavaScript ,强强联合,给了我们更多想象空间,能做一些有趣的事情,废话不多说,我们来看看两者是怎么结合进行互相调用。

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

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

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

Python 脚本:

# script.py
doSometing()

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

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

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

import sys, json

def main():
    msg = sys.argv[1]
    doSometing(msg)

if __name__ == '__main__':
    main()

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

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 前端传送的数据流,进行下一步的逻辑处理

import sys, json

def main():
    lines = sys.stdin.readlines()
    data = json.loads(lines)
    doSometing(data['msg'])

if __name__ == '__main__':
    main()

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

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)
})

最后调整 Python 脚本,用于向 Node 前端传送数据,示例代码如下:

import sys

# You will have your own implementation of get data. In this case lets assume it returns a dict/json
res = getData()
print(json.dumps(data))

sys.stdout.flush()

今天的文章就分享到这里,感谢你的阅读,有了这些示例后,你可以尝试下在业务中进行运用,你会发现 Python + NodeJS 的强大之处

前端达人公众号.jpg

注:本文属于原创文章,版权属于「前端达人」公众号及 qianduandaren.com 所有,未经授权,谢绝一切形式的转载


Tags

javascriptnodejsbasic
Previous Article
「基础」CSS Blend Modes 混合模式的学习与整理(上)
前端达人

前端达人

专注前端知识分享

相关文章

「短文」如何在 JavaScript 中随机数组
November 03, 2022
1 min

前端站点

VUE官网React官网TypeScript官网

公众号:前端达人

前端达人公众号