Node环境中调用Python脚本

1,533 阅读1分钟

今天遇到一个需要在Node服务中调用Python脚本的需求,这里就把这个场景单独抽离出来汇总一下方法 在node中的child_process中有execSync, exec两个方法来创建一个子进程,然后在子进程里执行对应的python命令,这两个命令可以让我们执行一个脚本命令。

exec && execSync

事先准备两个文件,一个node脚本(实际使用时,可以是Node服务中的脚本) 一个是需要被调用的python文件。

// 已近在本地安装好python3 环境
const { execSync, exec } = require('child_process')

// 在node脚本中运行python脚本-同步
const runPythonInNodeEnvSync = () => {
  // ${process.cwd()} 获取当前脚本运行目录
  const path = `${process.cwd()}/demo.py`;
  const data = execSync(`python3 ${path}`);
  console.log(`同步调用python脚本:${data.toString()}`);
}

// 在node脚本中运行python脚本-异步
const runPythonInNodeEnvAsync = () => {
  // ${process.cwd()} 获取当前脚本运行目录
  const path = `python3 ${process.cwd()}/demo.py`;
  exec(path, function(error,stdout,stderr){
    if(error) {
        console.info('stderr : '+stderr);
    }
    console.log(`异步调用python脚本:${stdout}`);
  })
}

runPythonInNodeEnvSync()
runPythonInNodeEnvAsync()

def fn():
    str = 'this is data come from python file'
    print(str)
    return str

val = fn() 

在这里插入图片描述

spawn


const { spawn } = require('child_process')


// 使用spawn来验证
const spawnFn = () => {
  const path = `${process.cwd()}/demo.py`;
  const py = spawn('python3', [path])
  
  py.stdout.on('data', (data) => {
    console.log(`stdout: ${data}`);
  });

  py.stderr.on('data', (data) => {
    console.error(`stderr: ${data}`);
  });

  py.on('close', (code) => {
    console.log(`child process exited with code ${code}`);
  }); 
}


spawnFn()

在这里插入图片描述

传递参数


const { spawn } = require('child_process')


// 使用spawn来验证
const spawnFn = () => {
  const path = `${process.cwd()}/demo.py`;
  const params = 'this is params'
  const py = spawn('python3', [path, params])
  
  py.stdout.on('data', (data) => {
    console.log(`stdout: ${data}`);
  });

  py.stderr.on('data', (data) => {
    console.error(`stderr: ${data}`);
  });

  py.on('close', (code) => {
    console.log(`child process exited with code ${code}`);
  }); 
}
spawnFn()

对应的python脚本也需要做一下修改


import sys

def fn():
    str = 'this is data come from python file'
    return str

def fn2():
    params = sys.argv[1]
    print(f"python中接受到的参数为: {params}")

val = fn2()
    

执行效果如下所示 在这里插入图片描述

参考文件

Node中文网