我可以使用child_process在服务器上生成多个python输出吗?

时间:2019-06-10 18:45:40

标签: python node.js child-process spawn

我正在尝试使用NodeJS执行多个python脚本并将这些脚本的内容发送到本地主机。我不想特定于确切的python脚本,而要使用类似于执行使用“ .py”的python脚本的方法。

我尝试运行多个进程,但是最后一个覆盖了本地主机上的前一个进程。

Python脚本:

hellothere.py

 print("hello there")

helloworld.py

 print("Hello World!")

Goodbye.py

 print("Goodbye!")

Pythonspawn.js

var express = require('express');

var app = express();

app.get('/name', function callName(req, res) {

    var spawn = require("child_process").spawn;

            var PythonProcess1 = spawn('python',["./hellothere.py"] );
            var PythonProcess2 = spawn('python', ['./helloworld.py']);
            var PythonProcess3 = spawn('python', ['./Goodbye.py']);
            PythonProcess1.stdout.on('data', function(data) {
            res.send(data.toString());
            })
            PythonProcess2.stdout.on('data', function(data) {
            res.send(data.toString());            
            })
            PythonProcess3.stdout.on('data', function(data) {
            res.send(data.toString());            
            })
        }
})   
app.listen(1820, function() {
    console.log('Server is running on port %d.', this.address().port);
})

我想执行任何使用“ .py”的python脚本,而不是指定要执行的确切脚本。如果可能的话,如果它们具有不同数量的参数,我还要执行脚本。 (即,如果helloworld.py有两个sys.arg [i],而Goodbye.py有一个sys.arg [i]。)

1 个答案:

答案 0 :(得分:0)

您可以在这里使用exec(),在这里,我正在检查当前工作目录中的所有.js文件,将其全部执行,并将结果添加到数组中,最后返回它。

const { exec } = require('child_process');

var result = [];
exec('ls | grep .js', (error, stdout, stderr) => {
  if (error) {
    console.error(`exec error: ${error}`);
    return;
  }
  var s = stdout.split('\n');
  s.pop();
  console.log(s);
  executeFiles(s);
});

function executeFiles(filenames) {
  filenames.forEach((element, index) => {
    exec(`node ${element}`, (error, stdout, stderr) => {
      if (error) {
        console.error(`exec error: ${error}`);
        return;
      }
      console.log(stdout);
      result.push(stdout.toString());
      if (index === filenames.length - 1) {
        console.log(result);
        return result;
      }
    });
  });
}