javascript - NodeJS 和 Python 之间的通信:传回多个参数
问题描述
截至目前,我正在使用内置的 child_process 来启动 Python 脚本并监听通过 stdout.on('data', (data)) 传回的任何数据,就像第一个 JS 代码的第 6 行一样。但从我所做的谷歌搜索中,我只看到一个东西被传回或一组东西被传回的例子都聚集在一起。我想知道是否有可能发回不止一个论点。下面是我的代码:
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
我该怎么做?
提前致谢!
解决方案
Node.js 和 Python 之间没有直接通信的接口,因此您无法传递自定义参数,您所做的只是使用执行 python 程序child_process
,因此您不会发送参数,接收到的任何内容在'data'
其上stdout
从 python 打印的内容。
所以你需要做的是序列化数据,然后在 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
将触发 a 。(通过 child_process 从 Python 向 Node 发送 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);
推荐阅读
- fortran - 是否允许为另一个过程的可选参数传递一个不存在的假定形状数组?
- c++ - 如何在 C++ 中使用模板获取值和指针的 Value_Type?
- python - 带有 Selenium 远程的 PyAutoGUI?
- python - 如何自动触发项目?
- javascript - 使用 ScrollTop 放大和缩小问题
- python - 将不同的值添加到列表而不成为元组
- ruby-on-rails - 如何在 Windows 上从 Ruby 2.5 升级到 2.7(使用 Rails 5.2.6)
- asp.net - 为什么Required IdentityUser 属性会导致可以为空的数据库字段?
- reactjs - 使用 Azure AD MSAL React 响应进行 Express Js 后端 API 令牌验证
- android - Android:资源联动失败,找不到文件