Node.js中child_process如何传递变量 子进程如何访问传入变量
实现方案
最适配当前场景的传参方式是命令行参数传递,child_process.spawn 的第二个参数本身就是传入目标脚本的参数列表,直接把图片路径追加进去即可,不需要额外依赖,步骤如下:
1. 修改Node侧(parent.js)代码
- 避免自定义变量和Node内置
path模块重名,提前把上传得到的图片路径转为绝对路径,防止Python侧因为工作目录不一致找不到文件 - 把图片路径作为参数追加到spawn的脚本参数数组中
- 补充stderr监听,方便直接排查Python脚本运行报错
修改后完整代码:
const { spawn } = require("child_process"); const path = require("path"); // 引入Node内置路径处理模块 const encodeImage = (req, res) => { try { // 转绝对路径,变量名改为imgPath避免和内置path模块重名 const imgPath = path.resolve(req.file.path); let dataToSend; // 把图片路径作为参数传给Python脚本 const python = spawn('python', ['controllers/script.py', imgPath]); python.stdout.on('data', function (data) { dataToSend = data.toString(); }); // 新增错误日志监听,捕获Python侧运行报错 python.stderr.on('data', (errData) => { console.error('Python脚本运行错误:', errData.toString()); }); python.on('close', (code) => { res.send(dataToSend) }); } catch (error) { console.log(error); } }
2. 修改Python侧(child.py)代码
Python脚本通过内置sys.argv列表获取命令行传入的参数,注意sys.argv[0]固定是脚本自身的路径,传入的第一个自定义参数对应下标为1:
import sys import cv2 as cv # 校验参数是否正常传入 if len(sys.argv) < 2: raise ValueError("未收到图片路径参数") # 读取传入的图片路径 img = cv.imread(sys.argv[1]) # 后续OpenCV处理逻辑正常编写即可
补充:环境变量传参方式(可选)
如果要传递敏感参数、或者不想把参数暴露在进程命令行列表里,可以用环境变量的方式传递:
- Node侧spawn时传入第三个配置项,注入自定义环境变量:
const python = spawn('python', ['controllers/script.py'], { env: { ...process.env, // 必须继承原有系统环境变量,否则Python侧会找不到系统依赖 IMG_PATH: imgPath } });
- Python侧通过os模块读取环境变量:
import os import cv2 as cv img_path = os.environ.get("IMG_PATH") if not img_path: raise ValueError("未从环境变量读取到图片路径") img = cv.imread(img_path)
注意:用环境变量传参时必须合并原有
process.env配置,否则Python子进程会丢失系统PATH等基础环境变量,出现找不到依赖、命令不存在等问题。
内容的提问来源于stack exchange,提问作者anadi45
相关产品推荐
相关产品推荐

