Node.js通过child_process调用Python脚本时sys.argv未返回预期值
解决Node.js child_process向Python传参失败的问题
问题根源
你的代码存在两个关键错误:
spawn参数传递错误:第二个参数是命令行参数数组,你把要传递的obj放到了第三个参数(进程配置项)的位置,导致Python完全没收到这个参数。- 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
相关产品推荐
相关产品推荐

