【Node.js】child_process 子进程

embedded/2024/9/23 19:32:13/

部分来自:Nodejs 第十五章(child_process) - 掘金 (juejin.cn)

创建子进程

Nodejs创建子进程共有7个API(Sync同步API,不加是异步API):

  1. spawn 执行命令
  2. exec 执行命令
  3. execFile 执行可执行文件
  4. fork 创建node子进程
  5. execSync 执行命令 同步执行
  6. execFileSync 执行可执行文件 同步执行
  7. spawnSync 执行命令 同步执行

exec

执行命令。exec只能通过返回的buffer去识别完成状态,识别起来较为麻烦。

child_process.exec(command, [options], callback)
// 获取node 版本号exec('node -v',(err,stdout,stderr)=>{if(err){return  err}console.log(stdout.toString())})

execSync

执行单次 shell ,比如这里我打开 edge 并打开百度。

execSync("start microsoft-edge:http://www.baidu.com")

execFile

execFile方法用于执行可执行文件,并且在执行完成后将结果传递给回调函数。例如执行一个node脚本,或者shell文件。这个方法适用于需要简单地执行外部命令,并且不需要与子进程进行交互的情况。

示例:

const { execFile } = require('child_process');execFile('ls', ['-lh', '/usr'], (error, stdout, stderr) => {if (error) {console.error(`执行出错: ${error}`);return;}console.log(`stdout: ${stdout}`);console.error(`stderr: ${stderr}`);
});

在这个示例中,ls命令会列出/usr目录的内容,并且将结果输出到标准输出。execFile方法将执行结果传递给回调函数,可以通过stdout获取标准输出的内容,通过stderr获取标准错误输出的内容。

2. spawn

spawn方法用于创建一个新的子进程,并且可以与子进程进行交互,包括向子进程发送输入数据,以及监听子进程的输出。

spawn 用于执行一些实时获取的信息,因为spawn返回的是流,边执行边返回;exec是返回一个完整的buffer。buffer的大小是200k,如果超出会报错,而spawn是无上限的。

示例:

const { spawn } = require('child_process');const ls = spawn('ls', ['-lh', '/usr']);ls.stdout.on('data', (data) => {console.log(`stdout: ${data}`);
});ls.stderr.on('data', (data) => {console.error(`stderr: ${data}`);
});ls.on('close', (code) => {console.log(`子进程退出,退出码 ${code}`);
});

在这个示例中,spawn方法创建了一个新的子进程来执行ls命令,然后监听子进程的标准输出和标准错误输出。当子进程退出时,将触发close事件。

3. fork

fork方法适合大量的计算,或者容易阻塞主进程操作的一些代码。

示例:

const { fork } = require('child_process');const child = fork('child.js');child.on('message', (message) => {console.log(`接收到消息:${message}`);
});child.send('你好,子进程!');

在这个示例中,fork方法创建了一个新的子进程来执行child.js文件,然后通过send方法向子进程发送消息。子进程可以通过监听message事件来接收消息。

应用实例

假设我们有一个Node.js程序,需要执行一个Python脚本,并且与该Python脚本进行通信,然后将结果返回给Node.js程序。

首先,我们创建一个名为main.js的Node.js程序:

// main.jsconst { spawn } = require('child_process');// 执行Python脚本
const pythonProcess = spawn('python', ['script.py']);// 监听Python脚本的输出
pythonProcess.stdout.on('data', (data) => {console.log(`Python脚本输出: ${data}`);
});// 监听Python脚本的错误输出
pythonProcess.stderr.on('data', (data) => {console.error(`Python脚本错误输出: ${data}`);
});// 监听Python脚本关闭事件
pythonProcess.on('close', (code) => {console.log(`Python脚本退出,退出码 ${code}`);
});

上面的代码中,我们首先引入了child_process模块中的spawn函数,该函数用于创建一个子进程来执行外部命令。然后我们使用spawn函数来执行Python脚本script.py。我们监听了子进程的stdout(标准输出)、stderr(标准错误输出)和close(关闭)事件。

接下来,我们编写一个简单的Python脚本script.py

# script.py# 将结果输出到标准输出
print(10)

运行main.js,它将启动Python脚本作为子进程,并通过标准输出打印Python脚本的输出。例如:

node main.js

这将输出Python脚本的输出:

Python脚本输出: 10Python脚本退出,退出码 0

在这个例子中,我们通过Node.js的child_process模块成功创建了一个Python子进程,并且能够与之进行通信。


http://www.ppmy.cn/embedded/11108.html

相关文章

python 对图片进行操作

Pillow是一个强大的图像处理库,它提供了许多用于打开、操作和保存图像的功能。 Image模块: Image模块提供了用于打开、创建、编辑和保存图像的基本功能。可以使用Image.open()函数来打开图像文件,或者使用Image.new()函数来创建新的图像,还可…

云原生Kubernetes: K8S 1.29版本 部署Jenkins

目录 一、实验 1.环境 2.K8S 1.29版本 部署Jenkins 服务 3.jenkins安装Kubernetes插件 二、问题 1.创建pod失败 2.journalctl如何查看日志信息 2.容器内如何查询jenkins初始密码 3.jenkins离线安装中文包报错 4.jenkins插件报错 一、实验 1.环境 (1&…

海外媒体广告投放 - 大舍传媒助力企业迈向新台阶,实现精准投放

一、为何选择海外媒体广告投放 随着全球化进程的不断推进,越来越多的企业开始将目光投向国际市场。海外媒体广告投放作为一种有效的宣传手段,可以帮助企业在全球范围内提高品牌知名度和影响力,吸引潜在客户,促进产品销售。 二、…

Linux:安装及管理程序

Linux:安装及管理程序 应用程序基础 应用程序与系统命令的关系 角色系统命令应用程序文件位置般在/bin和/sbin目录中,或为Shell内部指令通常在/usr/bin、/usr/sbin 和/usr/local/bin、/usr/local/sbin目录中主要用途完成对系统的基本管理工作&#xf…

Python中pop()函数用法

pop()函数是Python中一个非常实用的函数,用于删除可迭代对象中的元素,并返回该元素的值。基本用法为obj.pop(index),其中index为要删除的元素的索引,省略索引则默认删除最后一个元素。需要注意pop()函数会修改可迭代对象&#xff…

webAssembly学习及使用rust

学习理解 webAssembly 概念知识,使用 API 进行 web 前端开发。 概念 是一种运行在现代网络浏览器中的新型代码,并且提供新的性能特性和效果。它有一种紧凑的二进制格式,使其能够以接近原生性能的速度运行。C/C、 C#、Rust等语言可以编译为 …

实景景区亲自儿童剧本杀小程序开发搭建

实景景区亲自儿童剧本杀小程序开发搭建需要涉及多个方面的内容,包括系统架构设计、功能模块设计、页面设计、开发工具选择等。 系统架构设计需要确定小程序的开发框架,可以使用小程序开发框架来构建前端页面和后端接口,同时需要考虑数据库设…

vue2指令

vue2指令 v-model 的工作原理&#xff0c;它如何在表单输入和应用状态之间创建双向绑定 v-model 是 Vue 中一个特殊的指令&#xff0c;用于在表单 <input>、<textarea> 及 <select> 元素上创建双向数据绑定。它根据控件类型自动选取正确的方法来更新元素。…