节点子进程生成stdout返回为null

时间:2015-01-05 19:12:34

标签: node.js command-line-interface child-process

我正在编写Yeoman生成器并使用child_process.spawn()(通过yeoman的spawnCommand() - 请参阅https://github.com/yeoman/generator/blob/master/lib/actions/spawn_command.js

我的代码如下所示:

var list = this.spawnCommand('npm', ['list', 'sails'], {stdio: 'pipe'});
list.stdout.on('data', /* callback here that wants to consume the command's output */);

我可以看到list.stdio存在,并且它有[0,1,2]作为键。它们中的每一个都是null(或未定义)。也就是说,记录_.keys(list).join()输出,,list.stdout.on()给了我一个例外,说明stdout为空。

我需要完成的是检查是否安装了特定软件包并查看版本号是什么。但我后来还需要做其他解析CLI命令输出的东西(例如,git log输出),所以我需要一个通用的解决方案。 .spawn()似乎就像我想要的那样,但我见过的例子似乎表明stdout应该是具有.on()方法的东西。例如,此处给出的一个:http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options,其中显示正在运行ls -lh /usr

我错过了一些简单的东西吗?我想知道我运行的命令是否完全没有输出,如果这意味着stdout将为null。如果是这种情况,那么我只需要识别可能没有输出的命令,只需检查以确保stdout在尝试使用之前不为空。

编辑实际上,npm list命令的输出显示在命令行上,但在我用于诊断问题的日志语句之后(我将其放置)在.spawnCommand()调用之后和.on()调用之前。但是我需要在我的代码中访问它 - 让它出现在命令行旁边(除了它让我知道进程运行) CLI命令成功)。

3 个答案:

答案 0 :(得分:11)

我刚刚遇到过这个问题 - 看起来并没有太深入细节,但我可以告诉你,在spawn的选项中设置{stdio: 'whatever'}会阻止spawn返回一个带有{的对象{1}}和stdout个流 - 两者都是stderr

如果您删除该选项,他们将再次成为完全成熟的流(并可通过null访问。

the docs you linked to开始,您似乎可以将.on()设置为现有流 - 也许这就是您正在寻找的灵活性?

答案 1 :(得分:1)

如果孩子的出生时stdio设置为' pipe'以外的任何内容,那么subprocess.stdout将为null

答案 2 :(得分:0)

当您已经收听on('data', ...)时,给on('readable', ...)侦听器的数据为空,我很高兴知道这一点,因此我在此分享sharing。