我正在运行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()
会向程序发送一个命令,就好像用户在控制台中键入它一样。但是,由于该程序没有响应,我认为情况并非如此。如何发送程序输入?
我见过许多类似的问题,但不幸的是,他们的作者报告称“工作”的解决方案并不适用于我。
Sending input data to child process in node.js
我已经看到了这个问题和答案,并尝试了其中的所有内容但没有成功。我尝试使用\r\n
而不是\n
结束命令。我写完后还尝试添加行child.stdin.end()
。这些都没有奏效。
How to pass STDIN to node.js child process
这个人在他们的自我回答中说,他们的工作几乎与我一样,但是我的工作不起作用。
Nodejs Child Process: write to stdin from an already initialised process
这个人在自我回答中说,他们通过将输入写入文件然后将该文件传送到stdin
来使其工作。发送一个简单的字符串听起来过于复杂。
答案 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
函数。
因此,您可以在终端中查看生成的输出,并将其传递回用户。
有关更多详细信息,您可以检查:Child Processes