如何从JS向Python 3.8传递混合类型数组并解决进程卡住问题
Node.js调用Python脚本阻塞卡住问题修复
故障原因
- Python代码缺失必要依赖导入:代码中使用了
json、sys模块但未显式导入,运行时会直接抛出错误,无错误监听时会表现为进程卡住 - 标准输出缓冲机制导致数据未发送:Python进程stdout对接管道时默认使用块缓冲,调用
json.dump()写入的数据会暂存在内存缓冲区,未主动刷新的情况下不会发送到Node.js端,Node.js一直等不到stdout结束事件就会持续阻塞 - 缺失错误日志监听:Node.js侧未监听子进程stderr输出,Python侧的运行报错、语法错误无法透出,无法快速定位问题
修复步骤
1. 修正Python端代码
补全导入,添加缓冲区刷新逻辑,提前初始化图对象避免后续业务逻辑报错:
import sys import json import networkx as nx # 提前初始化有向图 G = nx.DiGraph() def createGraph(listOfAttr): for edge in listOfAttr: G.add_edge(edge[0], edge[1], weight=edge[2]) if __name__ == "__main__": my_list = json.load(sys.stdin) # 测试阶段直接回传数据验证通路,后续替换为负权环检测逻辑即可 json.dump(my_list, sys.stdout) # 强制刷新输出缓冲区,确保所有数据写入管道 sys.stdout.flush() # 正常退出进程触发Node端end事件 sys.exit(0)
2. 修正Node.js端子进程调用逻辑
启动Python进程时添加-u参数禁用标准流缓冲,添加stderr监听捕获错误:
const { spawn } = require('child_process'); // 替换为实际的Python可执行路径、脚本路径 const proc = spawn('python3', ['-u', './graph_calc.py']); function pyInput(){ const buffers = []; // 捕获Python侧错误日志 proc.stderr.on('data', (chunk) => { console.error('Python runtime error:', chunk.toString()); }); proc.stdout.on('data', (chunk) => buffers.push(chunk)); proc.stdout.on('end', () => { const result = JSON.parse(Buffer.concat(buffers).toString()); console.log('Python process exited, result:', result); }); proc.stdin.write(JSON.stringify([['a','b',1],['b','c',-6],['c','a',4],['b','d',5],['d','a', -10]])); proc.stdin.end(); } pyInput();
额外注意事项
- 后续接入负权环检测业务逻辑时,计算完成输出JSON后必须保留
sys.stdout.flush()操作,避免缓冲导致的数据丢失 - 不要在Python脚本中添加等待用户输入、无限循环类的阻塞逻辑,处理完传入数据后直接输出结果退出即可
- 若传输数据量超过管道默认缓存上限,需要拆分块写入stdin,避免大文件传输时的管道阻塞
内容的提问来源于stack exchange,提问作者Sajjad Abbas
相关产品推荐
相关产品推荐

