[英]How to run interactive shell command inside node.js?
我必须在 node.js 中运行一些交互式 shell 命令。 让我们的交互式 shell 为$ python
:
var cp = require('child_process');
var pythonChildProcess = cp.spawn('python');
pythonChildProcess.stdout.on("data", function(data) {
console.log('data successfully written!', data); // never outputs anything
});
pythonChildProcess.stdin.write('1 + 1');
pythonChildProcess.stdin.end();
这段代码没有 output 任何东西(但标准输出应该是2
)。
但如果是这样,就会有另一个问题:如何使它具有交互性? 当我调用pythonChildProcess.stdin.end();
! 但我只是想结束标准输入并写下一个标准输入!
UPD:如果我可以模拟按下enter
按钮 - 我将能够以交互方式写入进程。 但是将\n
添加到输入字符串的末尾并没有帮助。
首先,防止节点与其他交互式shell连接的一个原因是子应用程序必须保持其“交互”行为,即使stdin
看起来不像终端。 python
在这里知道它的stdin
不是终端,所以它拒绝工作。 可以通过在python命令中添加-i
标志来覆盖它。
其次,正如您在更新中提到的那样,您忘记在流中写入新行字符,因此程序的行为就像用户没有按Enter键一样。 是的,这是正确的方法,但缺乏交互模式阻止您检索任何结果。
您可以执行以下操作:将多个输入发送到交互式shell,同时仍然可以逐个检索每个结果。 该代码将抵抗冗长的输出,累积它们直到在执行另一条指令之前接收到完整的行。 也可以一次执行多个指令,如果它们不依赖于父进程的状态,则这可能是优选的。 随意尝试其他异步结构来实现您的目标。
var cp = require('child_process');
var childProcess = cp.spawn('python', ['-i']);
childProcess.stdout.setEncoding('utf8')
var k = 0;
var data_line = '';
childProcess.stdout.on("data", function(data) {
data_line += data;
if (data_line[data_line.length-1] == '\n') {
// we've got new data (assuming each individual output ends with '\n')
var res = parseFloat(data_line);
data_line = ''; // reset the line of data
console.log('Result #', k, ': ', res);
k++;
// do something else now
if (k < 5) {
// double the previous result
childProcess.stdin.write('2 * + ' + res + '\n');
} else {
// that's enough
childProcess.stdin.end();
}
}
});
childProcess.stdin.write('1 + 0\n');
对于那些通过阅读代码而理解的人来说,@ E_net4的答案是tl; dr版本。 有关详细说明,请阅读他的答案。 他描述得很好。
var spawn = require('child_process').spawn
var p = spawn('node',['-i']);
p.stdout.on('data',function (data) {
console.log(data.toString())
});
p.stdin.write('1 + 0\n');
输出:
>
1
这对我很有用:
const { spawn } = require('child_process')
const shell = spawn('sh',[], { stdio: 'inherit' })
shell.on('close',(code)=>{console.log('[shell] terminated :',code)})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.