JavaScript не может получить дочерний поток по одной строке за раз - PullRequest
1 голос
/ 31 января 2020

При использовании child_process.spawn в Node он порождает дочерний процесс и автоматически создает потоки 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, на самом деле оно должно работать так, как я ожидаю. И это действительно так, если я создаю другой подпроцесс. С ++ на этот раз. Но я не знаю, почему это не работает, когда я запускаю свой python скрипт. На самом деле, скрипт python отправляет только большие порции сообщений через стандартный вывод (возможно, когда буфер заполнен)

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Я решил свою проблему вчера. На самом деле это было связано с самой python, а не с child_process функцией.

Я должен сделать

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

вместо

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

на самом деле -u аргумент python сообщает гриппу sh данные как можно скорее.

1 голос
/ 31 января 2020

Я думаю, что вам нужно 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...