首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在NodeJS和Python之间通信:传回多个参数

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

Stack Overflow用户
提问于 2018-07-16 05:14:04
回答 1查看 2.9K关注 0票数 1

到目前为止,我正在使用内置的数据启动Python脚本,并侦听通过stdout.on(' data ',(data))返回的任何数据,就像第一个JS代码的第6行一样。但从我做过的谷歌搜索中,我只看到了传回一件事情或传回一组事情的例子,所有这些事情都聚集在一起。我想知道是否有可能发回不止一个参数。下面是我的代码:

JS:

代码语言:javascript
复制
const spawn = require('child_process').spawn;
pythonProcess = spawn('python', ["/path/to/python/file"]);

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

Python:

代码语言:javascript
复制
import sys

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

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

但是我想要发生的可能是回传一些类似数组的东西,它填充了我想要发回的东西,这样我就可以在JS文件中访问它们,如下所示:

代码语言:javascript
复制
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);

这将输出:

代码语言:javascript
复制
thing1: Hot
thing2: Cold
thing3: Warm

我该怎么做呢?

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2018-07-16 05:27:02

在Node.js和Python之间没有直接通信的接口,所以你不能传递自定义参数,你所做的只是使用child_process执行python程序,所以你不需要发送参数,在'data'上接收的任何东西,都是从python打印到stdout的。

因此,您需要做的是序列化数据,然后在节点中对其进行反序列化,您可以使用JSON来实现这一点。

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

代码语言:javascript
复制
{
   "thing1": "Hot",
   "thing2": "Cold",
   "thing3": "Warm"
}

在您的Node.js脚本中:

代码语言:javascript
复制
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是分块的,因此在解析JSON之前必须等待end事件被激发,否则将触发SyntaxError。(Sending JSON from Python to Node via child_process gets truncated if too long, how to fix?)

你可以使用任何你觉得舒服的序列化类型,JSON是最简单的,因为我们用的是javascript。

注意,stdout是一个流,所以它是异步的,这就是为什么你的例子永远不会工作。

代码语言:javascript
复制
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);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51352274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档