gpt4 book ai didi

node.js - 使用 spawnSync 流式传输子进程的输出,但将输出保存到父变量

转载 作者:行者123 更新时间:2023-12-05 07:46:40 26 4
gpt4 key购买 nike

我希望能够在子进程中运行时显示命令输出,然后在我的程序中处理输出。这可能吗?

var result = spawnSync('neo', ['-help'], {
stdio: 'inherit',
encoding: 'utf-8'
});
var savedOutput = result.stdout;

console.log(String(savedOutput));

最佳答案

这就是我最终所做的。

我包装了一个很棒的实用程序 cross-spawn进入我自己的模块。

执行器

var spawn = require('cross-spawn');
var util = require('util');
const Sugar = require('sugar');

// parses the output if it is in JSON format
function parse(str){
var outStr = str, res;
try {
res = JSON.parse(outStr.trim());
} catch (error) {
res = outStr;
}

return res;
}

module.exports = {
spawn() {
var args = Array.prototype.slice.call(arguments);
return new Promise(function (resolve, reject) {
var stdout = '', stderr = '';
var cp = spawn.apply(null, args);
cp.stdout.on('data', function (chunk) {
var res = parse(chunk.toString());
if (!res.result && res.commandOutput) { // pretty log
console.log(util.inspect(Sugar.Object.filter(res, (val, key) => key !== 'commandOutput'),{colors: true, depth:null}));
console.log(res.commandOutput);
} else console.log(res);

stdout += chunk;
});
cp.stderr.on('data', function (chunk) {
console.error(chunk.toString());
stderr += chunk;
});
cp.on('error', (e)=>{
reject((stderr && new Error(stderr)) || e);
})
.on('close', function (code) {
let output = parse(stdout);
if (code === 0) {
resolve(output);
} else {
let err = (output && output.errorMsg && new Error(output.errorMsg)) || new Error(stderr);
console.error(err);
reject(err);
}
});
});
},
};

然后我将它用作任何常规的 Promise shell exec:


const exec = require('./lib/exec');
...
函数 execAndLog (){
...
返回 exec.spawn(...execArgs, opts).then(processOutput);
}

关于node.js - 使用 spawnSync 流式传输子进程的输出,但将输出保存到父变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40489049/

26 4 0
文章推荐: php - 如何将用户添加到 Facebook 自定义受众
文章推荐: meteor 星系自动缩放
文章推荐: java - 在 @OneToMany Set 上使用 @JsonSerialize(using=MySerializer.class)