You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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处理逻辑正常编写即可

补充:环境变量传参方式(可选)

如果要传递敏感参数、或者不想把参数暴露在进程命令行列表里,可以用环境变量的方式传递:

  1. Node侧spawn时传入第三个配置项,注入自定义环境变量:
const python = spawn('python', ['controllers/script.py'], {
  env: {
    ...process.env, // 必须继承原有系统环境变量,否则Python侧会找不到系统依赖
    IMG_PATH: imgPath
  }
});
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 02:36:27