如何使用 stdio 选项“继承”读取 child_process.spawnSync 标准输出

Posted

技术标签:

【中文标题】如何使用 stdio 选项“继承”读取 child_process.spawnSync 标准输出【英文标题】:How to read child_process.spawnSync stdout with stdio option 'inherit' 【发布时间】:2016-06-11 20:58:36 【问题描述】:
var childProcess = cp.spawnSync(command, args, 
    cwd: process.cwd(),
    env: process.env,
    stdio: 'inherit',
    encoding: 'utf-8'
);

childProcess.output 总是 eq [null, null, null]

process.stdout.write 钩子没有给我任何输出

【问题讨论】:

您找到解决方案了吗?我有同样的问题,我需要使用'inherit' 以保持进度显示,但我无法挂钩stdout.write 或监听data 事件... @FranDios 我的解决方法是使用管道捕获进程输出stdio: [0, isOutputNeeded ? 'pipe' : 1, 2], 【参考方案1】:

使用它来显示进度:

var cp = require('child_process');

var command = 'echo';
var args = ['hello', 'world'];

var childProcess = cp.spawnSync(command, args, 
    cwd: process.cwd(),
    env: process.env,
    stdio: [process.stdin, process.stdout, process.stderr],
    encoding: 'utf-8'
);

所以你用数组[process.stdin, process.stdout, process.stderr]替换字符串'pipe'

【讨论】:

请评论否决票。我们都是来学习和帮助学习的,对吧? 我的猜测是因为这个解决方案不包括读取stdout 值的方法。它确实显示了如何检查/显示标准输出,但我相信@nitro-n 正在寻求一种方法来存储标准输出显示它(通过stdio: 'inherit')。 stdio: [process.stdin, process.stdout, process.stderr] 等价于 stdio: 'inherit'。因此,实际上,此解决方案与原始问题中的示例相同。 stdio: [process.stdin, process.stdout, process.stderr] 相当于 OP 的 stdio: 'inherit' 投赞成票只是因为这次讨论可以澄清@Bluu 所说的内容【参考方案2】:

如果您不使用'pipe',那么childProcess.output 将不包含输出。

var cp = require('child_process');

var command = 'echo';
var args = ['hello', 'world'];

var childProcess = cp.spawnSync(command, args, 
    cwd: process.cwd(),
    env: process.env,
    stdio: 'pipe',
    encoding: 'utf-8'
);

console.log(childProcess.output); // [ null, 'hello world\n', '' ]

这在documentation for child.stdout 和其他地方有点指示,但它并非完全明确。 (无论如何,如果您希望看到它得到改进,请针对 the Node.js repo 打开一个拉取请求。)

【讨论】:

这样我会错过 child_process 进度显示。这对我很重要。 @nitro-n:查看我的解决方案以获得正在进行的输出 谢谢。对于其他人,您可以使用childProcess.output[1] #=> 'hello world\n' 获取输出字符串

以上是关于如何使用 stdio 选项“继承”读取 child_process.spawnSync 标准输出的主要内容,如果未能解决你的问题,请参考以下文章

如何正确处理生成的 child_process 的 stdio?

C++ 覆盖继承的方法

在Angular2中,使用继承还是注入依赖?

javascript原型继承

我如何从child_process.execFile获得结果?

前端面试 JavaScript— JS如何实现继承?