Node学习笔记(二):用 child

tech2024-05-24  74

简介

因为 Node 项目中需要用到图片相似度比较,找不到合适的库, 所以就想着能不能调用 Python 程序来实现。 后来网上一查才知道,原来 Child process 模块就是干这个的(创建子进程,执行新的命令)

使用

子进程有多种创建方式(如下所示)

// 1. Asynchronous process creation child_process.exec(command[, options][, callback]) child_process.execFile(file[, args][, options][, callback]) child_process.fork(modulePath[, args][, options]) child_process.spawn(command[, args][, options]) // 2. Synchronous process creation child_process.execFileSync(file[, args][, options]) child_process.execSync(command[, options]) child_process.spawnSync(command[, args][, options])

我这里使用的是 execSync,因为这样可以将 Python 返回的结果,稍加处理后返回到前端; Python 代码

from PIL import Image from PIL import ImageChops import requests from io import BytesIO import sys def compareImages(img1, img2): img1 = Image.open(BytesIO(requests.get(img1).content)) img2 = Image.open(BytesIO(requests.get(img2).content)) try: diff = ImageChops.difference(img1, img2) if diff.getbbox() is None: # 图片间没有任何不同则直接退出 print(0) else: print(1) except ValueError as e: text = ("表示图片大小和box对应的宽度不一致") print(1) if __name__ == '__main__': compareImages(sys.argv[1], sys.argv[2])

Node 代码

// 默认返回Buffer,需设置 encoding = utf8 let stdout = child_process.execSync('python ./python/app.py ' + srcImgUrl + ' ' + imgUrl, {encoding: 'utf8'}) console.log('比较结果:', compareRes); // 继续其他操作

当然也可以使用异步exec,再通过 util.promisify + await 来实现同样的效果(下面是官方的一个例子)

const util = require('util'); const exec = util.promisify(require('child_process').exec); async function lsExample() { const { stdout, stderr } = await exec('ls'); console.log('stdout:', stdout); console.error('stderr:', stderr); } lsExample();
最新回复(0)