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


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

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


    Python 脚本:

    # script.py
    doSometing()
    如果我们的 Node 脚本向 Python 脚本传递参数,那该怎么传呢,如下段代码所示:

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


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

    1. import sys, json
    2.  
    3. def main():
    4.     msg = sys.argv[1]
    5.     doSometing(msg)
    6.  
    7. if __name__ == '__main__':
    8.     main()


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

    1. const spawn = require('child_process').spawn,
    2. const py = spawn('python3', ['script.py'])
    3. const data = {
    4.     msg: "Hello"
    5. }
    6.  
    7. py.stdin.write(JSON.stringify(data)) 
    8. //we have to send data as a string, so we are using JSON.stringify
    9. py.stdin.end()


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

    1. import sys, json
    2.  
    3. def main():
    4.     lines = sys.stdin.readlines()
    5.     data = json.loads(lines)
    6.     doSometing(data['msg'])
    7.  
    8. if __name__ == '__main__':
    9.     main()


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

    1. const spawn = require('child_process').spawn
    2. const py = spawn('python3', ['cscript.py'])
    3.  
    4. py.stdout.on('data', function(res){
    5.    let data = JSON.parse(res.toString())
    6.    console.log(data)
    7. })

  • 相关阅读:
    vue 向 docx模板中填充数据生成目标docx 文件
    ②【Docker】安装Docker可视化工具——Portainer
    1024特别剪辑: 使用Python Turtle 库绘制一棵随机生成的树
    centos7 Kafka安装
    第五届“强网”拟态防御国际精英挑战赛——预选赛入围战队篇
    【clickhouse专栏】单机版的安装与验证
    如何从 FastReport VCL 中将报表导出为PNG格式?
    ARP欺骗
    基于PHP+MySQL公积金在线办理系统的设计与实现
    QT人脸识别知识
  • 原文地址:https://blog.csdn.net/adofsauron/article/details/133859490