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

jin*_*ula 11 command-line-interface child-process node.js

我正在编写一个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 */);
Run Code Online (Sandbox Code Playgroud)

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

我需要做的是检查是否安装了特定的软件包,并查看版本号是什么.但我后来还需要做其他解析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不为null.

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

Rus*_*ney 12

我只是遇到了这个问题 - 我没有深入研究细节,但我可以告诉你,{stdio: 'whatever'}spawn选项中的设置可以防止spawn返回一个带有stdout和的对象stderr- 两者都是null.

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

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

  • 有没有办法设置`{stdio:'inherit或whatever'}`并且可以访问孩子的`stdout` /`stderr`流? (3认同)

小智 5

如果生成该孩子的stdio设置为“ pipe”以外的任何其他值,subprocess.stdout则将为null

看到