Подтвердить что ты не робот

Как дождаться окончания дочернего процесса в Node.js?

Я запускаю Python script через дочерний процесс в Node.js, например:

require('child_process').exec('python celulas.py', function (error, stdout, stderr) {
    child.stdout.pipe(process.stdout);
});

но Node не ждет завершения. Как я могу ждать завершения процесса?

EDIT: можно ли это сделать, выполнив дочерний процесс в модуле, который я вызываю из основного script?

4b9b3361

Ответ 1

Вы должны использовать exec-sync

Это позволит вашему script ожидать завершения выполнения exec

действительно прост в использовании:

var execSync = require('exec-sync');

var user = execSync('python celulas.py');

Взгляните на: https://www.npmjs.org/package/exec-sync

Ответ 2

Используйте exit событие для дочернего процесса.

var child = require('child_process').exec('python celulas.py')
child.stdout.pipe(process.stdout)
child.on('exit', function() {
  process.exit()
})

PS: На самом деле это не дубликат, так как вы не хотите использовать код синхронизации, если вам это действительно не нужно.

Ответ 3

Вам нужно удалить установки exec для слушателей, чтобы добавить к буферизированным stdout и stderr, даже если вы не проходите обратный вызов, он все еще буферизует вывод. Node все равно выйдет из дочернего процесса в буфере, в этом случае будет превышено.

var child = require('child_process').exec('python celulas.py');
child.stdout.removeAllListeners("data");
child.stderr.removeAllListeners("data");
child.stdout.pipe(process.stdout);
child.stderr.pipe(process.stderr);

Ответ 4

NodeJS поддерживает это синхронно. Использовать этот:

const exec = require("child_process").execSync;

var result = exec("python celulas.py");

// convert and show the output.
    console.log(result.toString("utf8");

Не забудьте преобразовать буфер в строку. В противном случае вы просто останетесь с шестнадцатеричным кодом.

Ответ 5

На мой взгляд, лучший способ справиться с этим - внедрить источник событий. Когда первый спавн завершится, сгенерируйте событие, которое указывает, что оно завершено.

const { spawn } = require('child_process');
const events = require('events');
const myEmitter = new events.EventEmitter();


firstSpawn = spawn('echo', ['hello']);
firstSpawn.on('exit'), (exitCode) => {
    if (parseInt(code) !== 0) {
        //Handle non-zero exit
    }
    myEmitter.emit('firstSpawn-finished');
}

myEmitter.on('firstSpawn-finished', () => {
    secondSpawn = spawn('echo', ['BYE!'])
})