到目前为止,我正在使用内置的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
我该怎么做?
谢谢!
答案 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);