今天遇到一个需要在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中文网