Javascript NodeJS和Python之间的通信:传回多个参数

Javascript NodeJS和Python之间的通信:传回多个参数,javascript,python,node.js,python-3.x,child-process,Javascript,Python,Node.js,Python 3.x,Child Process,现在,我正在使用内置的child_进程启动Python脚本,并监听通过stdout.on('data',(data))传回的任何数据,就像第一个JS代码的第6行一样。但从我所做的谷歌搜索中,我只看到一件东西被传回的例子,或者一组东西被传回的例子都聚集在一起。我想知道是否有可能发回不止一个论点。下面是我的代码: JS: Python: import sys var thing1 = "Cold"; var thing2 = "Hot"; var thing3 = "Warm"; print(t

现在,我正在使用内置的child_进程启动Python脚本,并监听通过stdout.on('data',(data))传回的任何数据,就像第一个JS代码的第6行一样。但从我所做的谷歌搜索中,我只看到一件东西被传回的例子,或者一组东西被传回的例子都聚集在一起。我想知道是否有可能发回不止一个论点。下面是我的代码:

JS:

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
我该怎么做


提前谢谢

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

所以您需要做的是序列化数据,然后在节点中反序列化它,您可以使用
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);
    }
});
请记住,
数据
是分块的,因此在解析
JSON
之前必须等待
结束
事件发出,否则将触发
语法错误
。()

您可以使用任何您觉得合适的序列化类型,
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);

您在那里编写的不是Python。如果您只是通过标准输出发送内容,那么您必须决定要使用什么数据格式。如果只是字符串本身没有逗号,那么它们可以是逗号分隔的字符串,然后接收端需要在它们到达时解析它们。如果只是一块数据,那么您可能希望发送JSON,这是一种预定义的格式,您可以使用库函数在两端创建和解析。此外,在node.js的接收端,您不知道在任何给定的
data
事件中会出现多少数据。它可以全部出现在一个
数据
事件中,也可以分解为多个独立的
数据
事件。因此,您要么累积所有数据,直到它说没有更多数据(子进程完成),要么检查增量输入的内容,并在识别出可以解析的整块数据时增量解析,并保留其余部分,直到下一个
数据
事件出现,以便将其与之结合。如果您的格式是JSON,在node.js端有一些JSON流读取器可以为您完成这项工作,因此在解析完一段JSON后,您只需从它们那里获取事件(如果您只有几个字符串,那么这可能是最简单的方法)。
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);