节点subprocess产生标准输出返回为空
我正在编写一个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]
作为键。 他们每个是空(或未定义)。 即,logging_.keys(list).join()
输出,,
。 list.stdout.on()
给我一个exception,说明stdout
为空。
我需要完成的是检查是否安装了特定的软件包,并查看版本号是什么。 但是我后来还需要做其他的事情来parsingCLI命令的输出(例如,git log output),所以我需要一个通用的解决scheme。 .spawn()
看起来像我想要的,但我所看到的例子似乎表明,标准输出应该是有一个.on()
方法的东西。 例如,这里给出的是: http : //nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options ,它显示了运行ls -lh /usr
。
我错过了一些简单的东西吗 我想知道如果我运行的命令没有返回任何输出,如果这意味着标准输出将为空。 如果是这种情况,那么我只需要确定可能没有输出的命令,并且在尝试使用它之前检查以确保stdout不为空。
编辑实际上,npm list命令的输出显示在命令行上,但在我用来诊断问题(在.spawnCommand()
调用之后和.spawnCommand()
调用之前的日志语句之后。但是我需要在代码中访问它 – 让它在命令行上显示出来(除了让我知道进程成功运行CLI命令外)。
我只是碰到了这个问题 – 没有深入细节,但是我可以告诉你,在spawn的选项中设置{stdio: 'whatever'}
阻止spawn返回一个包含stdout
和stderr
stream的对象 – 两者都会null
。
如果删除该选项,它们将再次成为完整的stream(可通过.on()
访问.on()
。
从你链接到的文档看来,你可以将stdio
设置为现有的stream – 也许这就是你正在寻找的灵活性?
如果孩子被设置为“pipe”以外的其他任何东西,则subprocess.stdout
将为null
。
看到