我正在通过Node.js中的子进程运行Python脚本,如下所示:
require('child_process').exec('python celulas.py', function (error, stdout, stderr) {
child.stdout.pipe(process.stdout);
});
但是Node不等待它完成。我如何等待流程完成?
是否有可能通过在我从主脚本调用的模块中运行子进程来做到这一点?
为子进程使用exit
事件
var child = require('child_process').exec('python celulas.py')
child.stdout.pipe(process.stdout)
child.on('exit', function() {
process.exit()
})
PS:这不是一个真正的重复,因为你不想使用同步代码,除非你真的需要它。
NodeJS支持同步执行此操作。
使用:
const execSync = require("child_process").execSync;
const result = execSync("python celulas.py");
// convert and show the output.
console.log(result.toString("utf8"));
记住将缓冲区转换为字符串。否则你将只剩下十六进制代码。
在nodejs中等待进程结束的简单方法是:
const child = require('child_process').exec('python celulas.py')
await new Promise( (resolve) => {
child.on('close', resolve)
})
你应该使用execc -sync
允许脚本等待执行完成
真的很好用:
var execSync = require('exec-sync');
var user = execSync('python celulas.py');
看一下:https://www.npmjs.org/package/exec-sync
在我看来,处理这个问题的最好方法是实现一个事件发射器。当第一个刷出完成时,发出一个事件,表示刷出完成。
const { spawn } = require('child_process');
const events = require('events');
const myEmitter = new events.EventEmitter();
firstSpawn = spawn('echo', ['hello']);
firstSpawn.on('exit', (exitCode) => {
if (parseInt(exitCode) !== 0) {
//Handle non-zero exit
}
myEmitter.emit('firstSpawn-finished');
}
myEmitter.on('firstSpawn-finished', () => {
secondSpawn = spawn('echo', ['BYE!'])
})
您需要删除exec安装的监听器以添加到缓冲的标准输出和标准错误中,即使您不传递回调,它仍然会缓冲输出。在这种情况下,节点仍然会退出子进程,在缓冲区中被超过。
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);
您可以使用Util.promisify
,例如:
const { exec } = require('child_process');
const Util = require('util');
const asyncExec = Util.promisify(exec);
asyncExec('python celulas.py')
.then((stdout, stderr) => {
stdout.pipe(process.stdout);
})
.catch(error => {
console.log('error : ', error);
});