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
相关产品推荐
相关产品推荐

