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

Node.js向Python函数传值异常:sys.argv[1]返回null求助

Node.js调用Python脚本出现null输出的问题解决

问题场景

Node.js代码:

let options = req.body
PythonShell.run('./chat.py', options, function (err, results) {
    console.log(results)
})

chat.py代码:

import sys
import json

def chatFun():
    options = json.loads(sys.argv[1])
    print(options)
    print(sys.argv[1])
    return

chatFun()
  • 仅保留print("hello world")时脚本正常运行
  • 添加print(sys.argv[1])后,Node控制台输出两行null
  • 传入的options具体值:
city: New York,
party_size: 5,
stay: hotel

问题原因

  1. 参数传递方式错误:直接把req.body(JSON对象)传给PythonShell的options参数,但PythonShell的options并非直接映射为命令行参数,sys.argv[1]根本没拿到正确的JSON字符串,甚至可能不存在,导致JSON解析失败。
  2. 无异常捕获:Python脚本解析失败时直接崩溃,没有输出有效内容,Node端的results就会返回null。

解决步骤

1. 修正Node.js端参数传递

将req.body转为JSON字符串,通过options.args字段传递命令行参数:

// 确保req.body已被解析为JSON对象(需提前配置body-parser等中间件)
const runOptions = {
  args: [JSON.stringify(req.body)]
};

PythonShell.run('./chat.py', runOptions, function (err, results) {
    if (err) {
        console.error(err);
        return;
    }
    console.log(results);
});

2. 给Python脚本添加异常处理

避免因参数错误导致脚本崩溃,同时输出错误信息便于排查:

import sys
import json

def chatFun():
    try:
        # 检查是否传入了参数
        if len(sys.argv) < 2:
            print("未传入参数")
            return
        
        options = json.loads(sys.argv[1])
        print(options)
        print(sys.argv[1])
    except json.JSONDecodeError as e:
        print(f"JSON解析失败: {str(e)}")
    except Exception as e:
        print(f"脚本出错: {str(e)}")

chatFun()

3. 额外检查

确保Node.js项目中已安装body-parser中间件,正确解析请求体:

const express = require('express');
const bodyParser = require('body-parser');
const app = express();

// 解析JSON格式的请求体
app.use(bodyParser.json());

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:39:27