节点子进程生成标准输出返回为空



我正在编写一个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]作为键。 它们中的每一个都是空的(或未定义的)。 也就是说,记录_.keys(list).join()输出,, . list.stdout.on()给了我一个例外,说明stdout为空。

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

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

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

我刚刚遇到了这个问题 - 没有深入研究细节,但我可以告诉你,在生成选项中设置{stdio: 'whatever'}可以防止生成返回具有stdoutstderr流的对象 - 两者都将null

如果删除该选项,它们将再次成为成熟的流(可通过 .on() .

从您链接到的文档来看,您似乎可以将stdio设置为现有流 - 也许这就是您正在寻找的灵活性?

如果孩子是在将 stdio 设置为"pipe"以外的任何值的情况下生成的,那么subprocess.stdout将被null

当您已经听过on('readable', ...)on('data', ...)听众给出的数据为空,我很乐意意识到这一点,所以我在这里😉分享它。

相关内容

  • 没有找到相关文章

最新更新