次のように、Node.jsの子プロセスでPythonスクリプトを実行しています。
require('child_process').exec('python celulas.py', function (error, stdout, stderr) {
child.stdout.pipe(process.stdout);
});
しかしNodeはそれが完了するのを待ちません。プロセスが完了するのをどのように待つことができますか?
編集:メインスクリプトから呼び出すモジュールで子プロセスを実行することでこれを行うことは可能ですか?
あなたはexec-syncを使うべきです
実行が完了するのをスクリプトが待機できるようにします
本当に使いやすい:
var execSync = require('exec-sync');
var user = execSync('python celulas.py');
子プロセスにはexit
イベントを使用します。
var child = require('child_process').exec('python celulas.py')
child.stdout.pipe(process.stdout)
child.on('exit', function() {
process.exit()
})
PS:本当に必要な場合を除いて同期コードを使用したくないので、それは実際には複製ではありません。
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);
私の意見では、これを処理する最良の方法は、イベントエミッターを実装することです。最初のスポーンが終了したら、それが完了したことを示すイベントを発行します。
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!'])
})