J'exécute un script Python via un processus enfant dans Node.js, comme ceci:
require('child_process').exec('python celulas.py', function (error, stdout, stderr) {
child.stdout.pipe(process.stdout);
});
mais Node n'attend pas que ça se termine. Comment puis-je attendre la fin du processus?
EDIT: Est-il possible de faire cela en exécutant le processus enfant dans un module que j'appelle à partir du script principal?
Vous devriez utiliser exec-sync
Cela permet à votre script d'attendre que votre exécution soit terminée
vraiment facile à utiliser:
var execSync = require('exec-sync');
var user = execSync('python celulas.py');
Jetez un coup d’œil à: https://www.npmjs.org/package/exec-sync
Utilisez l'événement exit
pour le processus enfant.
var child = require('child_process').exec('python celulas.py')
child.stdout.pipe(process.stdout)
child.on('exit', function() {
process.exit()
})
PS: Ce n'est pas vraiment un doublon, car vous ne voulez pas utiliser le code de synchronisation à moins d'en avoir vraiment besoin.
Vous devez supprimer les installations de listeners exec à ajouter à stdout et stderr en mémoire tampon. Même si vous ne passez aucun rappel, il restitue la sortie en tampon. Le nœud va toujours quitter le processus enfant dans la mémoire tampon est dépassé dans ce cas.
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);
À mon avis, la meilleure façon de gérer cela consiste à implémenter un émetteur d'événements. Lorsque la première apparition est terminée, émettez un événement indiquant qu'il est terminé.
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!'])
})