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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:45:33