JavaScript 无法一次接收一行子流

JavaScript can't receive child stream one line at a time

在 Node 中使用 child_process.spawn 时,它会生成一个子进程并自动创建 stdin、stdout 和 stderr 流以与子进程交互。

const child = require('child_process');
const subProcess = child.spawn("python", ["myPythonScript.py"])

subProcess.stdout.on('data', function(data) {
  console.log('stdout: ' + data); 
});

因此我在我的项目中实现了这一点,但问题是只有当缓冲区达到一定大小时,子进程才会实际写入输出流。而不是在缓冲区设置数据时(无论数据大小)。 事实上,我想在将子进程写入输出流时直接接收子进程输出流,而不是在它填满整个缓冲区时接收。任何解决方案?

编辑:正如 t.888 所指出的,它实际上应该像我预期的那样工作。如果我生成另一个子进程,它实际上会发生。这次是 C++。但我不知道为什么在我生成 python 脚本时它不起作用。实际上,python 脚本仅通过 stdout 发送大块消息(可能在缓冲区已满时)

我认为你需要 readline

const fs = require('fs');
const readline = require('readline');

async function processLineByLine() {
  const fileStream = fs.createReadStream('input.txt');

  const rl = readline.createInterface({
    input: fileStream,
    crlfDelay: Infinity
  });
  // Note: we use the crlfDelay option to recognize all instances of CR LF
  // ('\r\n') in input.txt as a single line break.

  for await (const line of rl) {
    // Each line in input.txt will be successively available here as `line`.
    console.log(`Line from file: ${line}`);
  }
}

processLineByLine();

来自https://nodejs.org/api/readline.html#readline_example_read_file_stream_line_by_line

我昨天解决了我的问题。这实际上是由于 python 本身而不是 child_process 函数。

我必须做

const subProcess = child.spawn("python", ["-u", "myPythonScript.py"])

而不是

const subProcess = child.spawn("python", ["myPythonScript.py"])

确实,-u 参数告诉 python 尽快刷新数据。