等待python脚本在节点js中执行

时间:2020-07-03 07:04:15

标签: python node.js image image-processing

我试图从用户那里获取图像作为输入,并使用python处理它,然后在节点js中显示处理后的结果。为此,用户首先上传图像,然后将其保存在uploads文件夹中。然后,python脚本获取该图像并对其进行处理,并将其保存在同一位置。最后,我显示新图像。 我曾尝试使用异步语句和诺言,但它们似乎不起作用。

app.post("/image", function(req, res){
  upload(req, res, (err)=> {  
    if(err){
      res.render('upload', {
      msg: err
      });
    } else {
      const promise = call_python(req, res);
      res.render('upload', {
        file: `./uploads/detected.png`
      });
    }
  })
}) 

call_python使用spawn调用python脚本。

上传仅使用multer来保存图像。

我的图片标签看起来像-<img src="<%= typeof file != 'undefined' ? file : '' %>" class="responsive-img">

编辑:我现在包括如下的call_python。

async function call_python (req, res) {
  var spawn = require("child-process-promise").spawn;
  let promise = await new Promise((reject, resolve) => {
    try {
    spawn('python', ["script.py"], {capture: ['stdout', 'stderr', 'on']})
    resolve(1)
    }
    catch (err) { console.log(err)}
}).catch(()=> {})
return promise;

1 个答案:

答案 0 :(得分:0)

如果call_python()函数具有异步功能,那么您要做的就是:

app.post("/image", function(req, res){
  upload(req, res, async (err)=> {  
    if(err){
      res.render('upload', {
      msg: err
      });
    } else {
      await call_python(req, res);
      res.render('upload', {
        file: `./uploads/detected.png`
      });
    }
  })
})

在执行下一个命令之前,您必须“等待”它完成。

以及call_functiom:

async function call_python (req, res) {
  const spawnSync = require("child-process-promise").spawnSync;
  return new Promise((reject, resolve) => {
    try {
    spawnSync('python', ["script.py"], {capture: ['stdout', 'stderr', 'on']})
    resolve(1)
    }
    catch (err) { console.log(err)}
  }).catch(()=> {})
}

您将需要了解spwan()是异步的,使其同步以在解析结束后返回解析。