NodeJS项目中如何向Python脚本传输数据并获取处理反馈?
Node.js 调用 Python 脚本并实现数据交互
完善方案说明
你的现有代码已实现基础的标准输入数据传递,但缺少 Python 处理结果回传给 Node.js 的逻辑,且 Node.js 端未监听 Python 输出。以下是补全后的完整实现,包含数据发送、结果接收与错误处理。
完整代码实现
Node.js 端
需监听子进程的stdout获取 Python 输出,同时通过stderr捕获执行错误,建议每次调用创建新子进程避免复用导致的异常:
const { spawn } = require('child_process'); async function start() { // 每次调用创建新的 Python 子进程 const pyProcess = spawn('python3', ['process.py']); const data = [1, 2, 3, 4, 5]; // 向 Python 发送序列化后的 JSON 数据 pyProcess.stdin.write(JSON.stringify(data)); pyProcess.stdin.end(); // 监听 Python 标准输出,解析处理结果 pyProcess.stdout.on('data', (output) => { try { const result = JSON.parse(output.toString().trim()); console.log('Python 处理完成,结果:', result); // 此处添加后续业务逻辑 } catch (err) { console.error('解析 Python 输出失败:', err); } }); // 捕获 Python 脚本执行错误 pyProcess.stderr.on('data', (err) => { console.error('Python 脚本执行出错:', err.toString()); }); // 监听子进程退出状态 pyProcess.on('close', (code) => { console.log(`Python 子进程退出,退出码: ${code}`); }); } // 启动执行 start();
Python 端
需将处理后的结果转为可 JSON 序列化的格式输出,确保输出内容纯净无多余调试信息,避免干扰 Node.js 解析:
import sys import json import numpy as np def read_in(): # 读取标准输入的所有内容并解析为 JSON input_content = sys.stdin.read() return json.loads(input_content) def main(): raw_data = read_in() # 示例处理逻辑:用 numpy 将数组元素翻倍 processed_array = np.array(raw_data) * 2 # 将 numpy 数组转为普通列表,确保可 JSON 序列化 result = processed_array.tolist() # 输出序列化后的结果 print(json.dumps(result)) if __name__ == '__main__': main()
核心注意事项
- 数据序列化一致性:两端统一使用 JSON 格式传递数据,避免因格式不匹配导致解析失败。
- 子进程复用问题:若需多次调用脚本,每次创建新子进程,避免复用已关闭 stdin 的进程。
- 输出纯净性:Python 脚本中不要添加多余的
print调试语句,否则会破坏结果的 JSON 结构。 - 错误监听:务必监听
stderr和子进程close事件,快速排查脚本执行异常。
内容的提问来源于stack exchange,提问作者Alex Dalen
相关产品推荐
相关产品推荐

