如何在Node.js中等待子进程完成?

如何在Node.js中等待子进程完成?,node.js,child-process,Node.js,Child Process,我通过Node.js中的子进程运行Python脚本,如下所示: require('child_process').exec('python celulas.py', function (error, stdout, stderr) { child.stdout.pipe(process.stdout); }); 但Node并不等待它完成。我如何才能等待流程完成 编辑:是否可以通过在从主脚本调用的模块中运行子进程来完成此操作?您应该使用exec sync 允许脚本等待exec完成 非常易

我通过Node.js中的子进程运行Python脚本,如下所示:

require('child_process').exec('python celulas.py', function (error, stdout, stderr) {
    child.stdout.pipe(process.stdout);
});
但Node并不等待它完成。我如何才能等待流程完成


编辑:是否可以通过在从主脚本调用的模块中运行子进程来完成此操作?

您应该使用exec sync

允许脚本等待exec完成

非常易于使用:

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

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

对子进程使用
退出
事件

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

PS:它实际上不是重复的,因为除非您真的需要,否则您不想使用同步代码。

您需要删除listeners exec安装以添加到缓冲的stdout和stderr,即使您没有通过回调,它仍然会缓冲输出。在这种情况下,节点仍将退出缓冲区中的子进程

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

NodeJS支持同步执行此操作。 使用以下命令:

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

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

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

请记住将缓冲区转换为字符串。否则,只会留下十六进制代码

这些答案中的大多数可能重复的答案都不起作用,并且Nodejs文档很糟糕或者根本不存在:-/现代编程语言如何在处理如此基本的东西时遇到如此困难?这是一个更好的答案。您应该尽可能避免在节点中阻塞(同步)代码-它会在等待子进程完成时停止整个程序。还有一个
'end'
事件,可能会为不同的调用发出不同的事件(
exec()
spawn()
)。退出事件不一定会被触发。例如,如果进程未能生成,则调用错误事件。但是,如果进程确实生成了,并且导致了另一个错误,则将调用这两个处理程序。这是正确的答案。当前正确答案会阻止重要的子进程日志。这是其他一些相反问题的答案。虽然此答案是正确的,但我强烈建议不要在node.js中使用同步方法。这将完全阻止应用程序,直到命令完成。看见它说不要在生产中使用它。试图找出如何安装它,但当我尝试在这个特定的库上运行npm安装时,我得到了一个错误列表。@BryanJohnson关于使用什么的建议可能会有所帮助。@a.Wentzel我推荐一个alex回答中描述的非同步调用。execSync可以用于简单的脚本,但我似乎总是后悔使用同步方法。exec-sync现在(2019年)被破坏了。只要你知道“香草”的方法。我把它作为一个答案贴在这个帖子上。这应该是公认的答案。