javascript - 如何运行交互式 shell 命令 inside node.js?

  显示原文与译文双语对照的内容
0 0

我必须运行一些交互式 shell 命令 inside node.js 。 让我们的交互式 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();

这里代码不输出任何( 但是stdout应该是 2 ) 。

但如果这样会有另一个问题: 如何使它成为交互式的? 当我调用 pythonChildProcess.stdin.end(); 时进程结束 ! 但是我只是想结束stdin并编写下一个 !

如果我可以模拟 enter 按钮,我将能够交互式地写到进程。 但是在输入字符串的末尾添加 n 并没有帮助。

时间:原作者:4个回答

0 0

首先是阻止节点与其他交互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 + 0n');
原作者:
...