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

child_process spawn在父目录运行时无法获取数据问题求助

问题原因与解决办法

问题根源

问题出在Python脚本的相对路径上:当你在父目录执行node folder/project.js时,Node进程的当前工作目录是父目录,而非project.js所在的folder目录。此时./python.py会被解析成父目录下的文件,但该文件不存在,导致Python进程直接启动失败,stdout无输出就触发了end事件,最终responseArray为空。

解决办法

1. 用绝对路径定位Python脚本

通过__dirname获取当前Node脚本的所在目录,拼接出Python脚本的绝对路径,确保无论从哪个目录执行Node命令,路径都正确:

const { spawn } = require('child_process');
const path = require('path');

// 生成Python脚本的绝对路径
const pyScriptPath = path.join(__dirname, 'python.py');
const py = spawn('python3', [pyScriptPath]);
let responseArray = [];

py.stdin.write(JSON.stringify(sendData));
py.stdin.end();

py.stdout.on('data', function (data) {
    responseArray = JSON.parse(data.toString());
});

py.stdout.on('end', function () {
    console.log(responseArray);
});

// 新增错误监听,方便排查问题
py.stderr.on('data', (data) => {
    console.error(`Python错误输出: ${data}`);
});

2. 切换子进程的工作目录

在spawn的配置选项中,指定cwd为Node脚本所在目录,让子进程的工作目录和脚本目录保持一致,相对路径就能正常解析:

const { spawn } = require('child_process');

const py = spawn('python3', ['./python.py'], {
    cwd: __dirname // 将子进程工作目录设为当前脚本所在目录
});
let responseArray = [];

py.stdin.write(JSON.stringify(sendData));
py.stdin.end();

py.stdout.on('data', function (data) {
    responseArray = JSON.parse(data.toString());
});

py.stdout.on('end', function () {
    console.log(responseArray);
});

// 新增错误监听,方便排查问题
py.stderr.on('data', (data) => {
    console.error(`Python错误输出: ${data}`);
});

额外建议

  • 始终保留stderr监听:Python进程启动失败或报错时,能直接看到错误信息,快速定位问题。
  • 给JSON.parse加容错处理:如果Python输出的不是合法JSON,会抛出错误,用try-catch包裹避免程序崩溃:
py.stdout.on('data', function (data) {
    try {
        responseArray = JSON.parse(data.toString());
    } catch (err) {
        console.error('解析Python返回的JSON失败:', err);
        console.error('原始返回数据:', data.toString());
    }
});

内容的提问来源于stack exchange,提问作者Fábio Gonçalves

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:15:00