如何实现nodejs和一个python子进程的双向通信
How to implement two-way communication between nodejs and a python subprocess
我有一个 node.js 应用程序需要将输入传递给 python 程序并取回输入。这个过程需要经常发生并且延迟尽可能少。因此我选择使用 child_process 包。 javascript代码如下
child_process = require('child_process');
class RFModel {
constructor () {
this.answer = null;
this.python = child_process.spawn('python3', ['random_forest_model.py']);
this.python.stdout.on('data', (data)=>{
this.receive(data);
});
}
send (data) {
this.answer = null;
this.python.stdin.write(data);
}
receive (data) {
data = data.toString('utf8')
console.log(data)
this.answer = data;
}
}
const model = new RFModel()
function timeout(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
(async ()=>{
await timeout(7000)
model.send('asdf')
})();
这是 python 代码:
import sys
sys.stdout.write('test')
sys.stdout.flush()
for line in sys.stdin:
open("test.txt", "a") #janky test if input recieved
sys.stdout.write(line)
sys.stdout.flush()
nodejs 进程收到来自 python 进程的第一个“测试”输出,但似乎 python 没有收到来自 nodejs 的任何输入,因为没有回显或文本文件正在创建。
我做错了什么?
我不是 python 专家,但据推测,for line in sys.stdin:
需要一个实际的行(一系列字符后跟一个换行符)。但是,从您的 nodejs 程序中您没有发送换行符。您只是发送一系列字符。所以你的 Python 程序仍在等待换行符来表示行的结束。
尝试改变这个:
model.send('asdf')
对此:
model.send('asdf\n')
当我 运行 现在进行此更改时,我得到此输出:
test
asdf
asdf
出现之前有延迟。
我有一个 node.js 应用程序需要将输入传递给 python 程序并取回输入。这个过程需要经常发生并且延迟尽可能少。因此我选择使用 child_process 包。 javascript代码如下
child_process = require('child_process');
class RFModel {
constructor () {
this.answer = null;
this.python = child_process.spawn('python3', ['random_forest_model.py']);
this.python.stdout.on('data', (data)=>{
this.receive(data);
});
}
send (data) {
this.answer = null;
this.python.stdin.write(data);
}
receive (data) {
data = data.toString('utf8')
console.log(data)
this.answer = data;
}
}
const model = new RFModel()
function timeout(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
(async ()=>{
await timeout(7000)
model.send('asdf')
})();
这是 python 代码:
import sys
sys.stdout.write('test')
sys.stdout.flush()
for line in sys.stdin:
open("test.txt", "a") #janky test if input recieved
sys.stdout.write(line)
sys.stdout.flush()
nodejs 进程收到来自 python 进程的第一个“测试”输出,但似乎 python 没有收到来自 nodejs 的任何输入,因为没有回显或文本文件正在创建。 我做错了什么?
我不是 python 专家,但据推测,for line in sys.stdin:
需要一个实际的行(一系列字符后跟一个换行符)。但是,从您的 nodejs 程序中您没有发送换行符。您只是发送一系列字符。所以你的 Python 程序仍在等待换行符来表示行的结束。
尝试改变这个:
model.send('asdf')
对此:
model.send('asdf\n')
当我 运行 现在进行此更改时,我得到此输出:
test
asdf
asdf
出现之前有延迟。