如何将输入发送到使用spawn创建的子进程?的NodeJS

时间:2017-05-29 20:26:32

标签: node.js

我正在运行Windows 10,我有一个程序,我们称之为program,可以从命令行运行。运行时,它会响应用户输入的命令。用户输入命令,按返回键,程序打印响应。我没有制作这个程序而且没有源代码,所以我无法修改它。

我想从Node.js中运行这个程序,让我的Node.js程序充当用户,发送命令并获取响应。我像这样生成我的程序:

var spawn = require('child_process').spawn;
var child = spawn('program');

child.stdout.on('data', function(data) {
    console.log(`stdout: ${data}`);
});

然后我尝试向它发送一个命令,例如help

child.stdin.write("help\n");

没有任何反应。如果我手动运行程序,请键入help,然后按返回键,我会输出。我希望Node.js运行程序,发送输入,并像人类用户那样接收输出。我假设stdin.write()会向程序发送一个命令,就好像用户在控制台中键入它一样。但是,由于该程序没有响应,我认为情况并非如此。如何发送程序输入?

我见过许多类似的问题,但不幸的是,他们的作者报告称“工作”的解决方案并不适用于我。

2 个答案:

答案 0 :(得分:0)

这对我有用。我已经使用child_process exec创建了一个子进程。在此子进程Promise中,我正在处理cmd作为参数给出的I / O部分。它不是完美的,但是可以正常工作。

不需要任何人工输入的示例函数调用。

executeCLI("cat ~/index.html");

与aws cli交互的示例函数调用。在这里

executeCLI("aws configure --profile dev")

自定义executeCLI函数的代码。

var { exec } = require('child_process');
async function executeCLI(cmd) {
  console.log("About to execute this: ", cmd);
  var child = exec(cmd);
  return new Promise((resolve, reject) => {
    child.stdout.on('data', (data) => {
      console.log(`${data}`);
      process.stdin.pipe(child.stdin);
    });

    child.on('close', function (err, data) {
      if (err) {
        console.log("Error executing cmd: ", err);
        reject(err);
      } else {
        //   console.log("data:", data)
        resolve(data);
      }
    });
  });
}

答案 1 :(得分:0)

从浏览器中提取用户输入代码,并使用fs模块将该代码保存到系统中的文件中。将该文件设为“ program.cpp ”,然后将输入的用户数据保存在文本文件中。

由于我们可以类似地使用g ++在终端上编译c ++代码,因此我们将使用child_process访问系统终端并运行用户代码。

execFile可用于执行我们的程序

var { execFile } = require('child_process');

execFile("g++", ['program.cpp'], (err, stdout, stderr) => {
    if (err) {
        console.log("compilation error: ",err);
    } else{
        execFile ('./a.out' ,['<', 'input.txt'], {shell: true}, (err, stdout, stderr) => {
            console.log("output: ", stdout);         
        })
    }
})

在此代码中,我们仅需要child_process并使用其execFile函数。

  • 首先,我们编译 program.cpp 中存在的代码,该代码会创建默认的 a.out 作为输出文件
  • 然后我们传递a.out文件,其中包含 input.txt
  • 中存在的输入

因此,您可以在终端中查看生成的输出,并将其传递回用户。

有关更多详细信息,您可以检查:Child Processes