web-dev-qa-db-ja.com

Node.jsで子プロセスが完了するのを待つ方法は?

次のように、Node.jsの子プロセスでPythonスクリプトを実行しています。

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

しかしNodeはそれが完了するのを待ちません。プロセスが完了するのをどのように待つことができますか?

編集:メインスクリプトから呼び出すモジュールで子プロセスを実行することでこれを行うことは可能ですか?

21
David

あなたはexec-syncを使うべきです

実行が完了するのをスクリプトが待機できるようにします

本当に使いやすい:

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

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

ご覧ください: https://www.npmjs.org/package/exec-sync

2
Frederic Nault

子プロセスにはexitイベントを使用します。

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

PS:本当に必要な場合を除いて同期コードを使用したくないので、それは実際には複製ではありません。

53
alex

NodeJSはこれを同期的に行うことをサポートします。これを使って:

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

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

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

バッファを文字列に変換することを忘れないでください。そうしないと、16進コードが残ります。

バッファリングされたstdoutとstderrに追加するには、execがインストールしたリスナーを削除する必要があります。コールバックを渡さなくても、出力はバッファリングされます。 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);
2

私の意見では、これを処理する最良の方法は、イベントエミッターを実装することです。最初のスポーンが終了したら、それが完了したことを示すイベントを発行します。

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!'])
})
1
TylersSN