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

Node调用Python返回UTF-8 Buffer无法转换为目标JS数组问题

解决方案

核心问题说明

  • spawn 的 stdout 是流式输出,data 事件会被触发多次,每次返回的只是部分Buffer片段,直接单次处理必然得不到完整结果,需要先拼接所有Buffer片段。
  • Python打印的列表是Python语法格式,用单引号包裹字符串,不符合JSON格式要求,不能直接用JSON.parse,需要先做格式兼容处理。

修正后可用代码

const { spawn } = require('child_process');
const pyProg = spawn(`${srcDirectory}/venv/Scripts/python.exe`, [`${srcDirectory}/optimization/optimizationFunction.py`]);

// 存储所有输出的Buffer片段
let chunks = [];

// 接收数据片段,拼接到数组中
pyProg.stdout.on('data', (data) => {
  chunks.push(data);
});

// 子进程执行完成后处理完整输出
pyProg.stdout.on('end', () => {
  // 拼接所有Buffer,转成完整UTF-8字符串
  const pyOutput = Buffer.concat(chunks).toString('utf8');
  // 将Python格式的单引号替换为JSON兼容的双引号
  const jsonStr = pyOutput.replace(/'/g, '"');
  // 解析为JS数组,resultArr就是你需要的目标结构,可直接使用
  const resultArr = JSON.parse(jsonStr);
  console.log(resultArr);
});

// 可选:捕获Python脚本的错误输出,方便排查问题
pyProg.stderr.on('data', (err) => {
  console.error('Python脚本执行错误:', err.toString());
});

优化方案(兼容性更高)

如果你的Python输出内容中存在包含单引号的字符串,上述全局替换单引号的操作会出错,更推荐直接修改Python脚本,输出标准JSON格式字符串,避免格式转换问题:

import json
# 你的原始结果列表
res = [['r1', '1e45200a-f990-4fda-a76b-b00fa05d9f53', 200.0], ['r2', '1e45200a-f990-4fda-a76b-b00fa05d9f53', 199.9999999999999]]
# 直接打印JSON字符串
print(json.dumps(res))

修改后Node侧不需要做引号替换,拿到完整字符串后直接JSON.parse即可。

内容的提问来源于stack exchange,提问作者robertJSnoobie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:24:04