如何实现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 出现之前有延迟。