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

Node.js通过child_process调用Python脚本时sys.argv未返回预期值

解决Node.js child_process向Python传参失败的问题

问题根源

你的代码存在两个关键错误:

  1. spawn参数传递错误:第二个参数是命令行参数数组,你把要传递的obj放到了第三个参数(进程配置项)的位置,导致Python完全没收到这个参数。
  2. JS对象无法直接作为命令行参数传递:命令行参数仅支持字符串类型,必须先把对象序列化为JSON字符串,Python端再反序列化解析。

修正后的Node.js代码

app.get("/", (request, response) => {
  console.log('hi')
  var dataToSend;
  var nodeData = "jeff";
  console.log('breh')
  var obj = {obj1: image3v, obj2: image4v};
  // 将对象序列化为JSON字符串,作为命令行参数传入
  const pythonArgs = ['script1.py', JSON.stringify(obj)];
  // spawn第三个参数为可选配置项,无需特殊配置可省略
  const python = spawn('python', pythonArgs);
  console.log('welp')

  python.stdout.on('data', function (data) {
    dataToSend = data.toString();
  });
  
  python.stderr.on('data', data => {
    console.error(`stderr: ${data}`);
    console.log(data)
  })
  
  python.on('exit', (code) => {
    console.log('exited')
    console.log(dataToSend);
    // run new stuff here
  });
})

修正后的Python代码

import sys
import json

print('python begins')
# 先判断是否存在传入参数
if len(sys.argv) < 2:
    print("未收到传入的参数")
    sys.exit(1)

# 解析JSON字符串为Python字典
try:
    received_obj = json.loads(sys.argv[1])
    print("收到的对象:", received_obj)
    print("obj1的值:", received_obj['obj1'])
    print("obj2的值:", received_obj['obj2'])
except json.JSONDecodeError as e:
    print("JSON解析失败:", e)
    sys.exit(1)

# 原打印语句保留参考
print(sys.argv)

可选方案:用stdin/stdout传递数据(适合大对象)

如果obj体积较大,命令行参数会有长度限制,推荐用标准输入输出传递:

Node.js端修改:

const python = spawn('python', ['script1.py']);
// 向Python的stdin写入JSON字符串
python.stdin.write(JSON.stringify(obj));
python.stdin.end(); // 结束输入流

// 其他部分与之前一致

Python端修改:

import sys
import json

// 从stdin读取数据
data = sys.stdin.read()
received_obj = json.loads(data)
print("收到的对象:", received_obj)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:41:30