在NodeJS和Python之间进行通信:传回多个参数

时间:2018-07-15 21:14:04

标签: javascript python node.js python-3.x child-process

到目前为止,我正在使用内置的child_process启动Python脚本,并侦听通过stdout.on('data',(data))返回的任何数据,就像第一个JS代码的第6行一样。但是从Google搜索的结果来看,我只看到一个回传或一组回传的示例全部聚集在一起的例子。我想知道是否可能传回不止一个论点。下面是我的代码:

JS:

const spawn = require('child_process').spawn;
pythonProcess = spawn('python', ["/path/to/python/file"]);

pythonProcess.stdout.on('data', (data) => {
    console.log(data);
});

Python:

import sys

var thing1 = "Cold";
var thing2 = "Hot";
var thing3 = "Warm";

print(thing1);
print(thing2);
print(thing3);
sys.stdout.flush();

但是我想发生的事情可能是传回类似数组的内容,该数组充满了我想发回的东西,这样我就可以像这样在JS文件中访问它们:

const spawn = require('child_process').spawn;
pythonProcess = spawn('python', ["/path/to/python/file"]);

pythonProcess.stdout.on('data', (data) => {
    thing1 = data[0];
    thing2 = data[1];
    thing3 = data[2];
})

console.log('thing1: ' + thing1);
console.log('thing2: ' + thing2);
console.log('thing3: ' + thing3);

哪个会输出:

thing1: Hot
thing2: Cold
thing3: Warm

我该怎么做?

谢谢!

1 个答案:

答案 0 :(得分:2)

Node.js和Python之间没有直接通信的接口,因此您无法传递自定义参数,而您所做的只是使用child_process执行python程序,因此您不会t发送自变量,则'data'上收到的任何内容都将从python打印到stdout

因此,您需要做的是将数据序列化,然后在Node中反序列化,您可以为此使用JSON

从您的python脚本中,输出以下JSON对象:

{
   "thing1": "Hot",
   "thing2": "Cold",
   "thing3": "Warm"
}

在您的Node.js脚本中:

const spawn = require('child_process').spawn;
const pythonProcess = spawn('python', ["/path/to/python/file"]);

const chunks = [];

pythonProcess.stdout.on('data', chunk => chunks.push(chunk));

pythonProcess.stdout.on('end', () => {

    try {
        // If JSON handle the data
        const data = JSON.parse(Buffer.concat(chunks).toString());

        console.log(data);
        // {
        //    "thing1": "Hot",
        //    "thing2": "Cold",
        //    "thing3": "Warm"
        // }

    } catch (e) {
        // Handle the error
        console.log(result);
    }
});

请记住,data是分块的,因此必须等到end事件发出后再解析JSON,否则将触发SyntaxError。 (Sending JSON from Python to Node via child_process gets truncated if too long, how to fix?

您可以使用自己喜欢的任何类型的序列化,JSON是最简单的,因为我们使用的是JavaScript。


请注意,stdout是一个流,因此它是异步的,这就是您的示例永远无法工作的原因。

pythonProcess.stdout.on('data', (data) => {
    thing1 = data[0];
    thing2 = data[1];
    thing3 = data[2];
})

// Things do not exist here yet
console.log('thing1: ' + thing1);
console.log('thing2: ' + thing2);
console.log('thing3: ' + thing3);