通过nodejs执行python脚本

时间:2017-04-19 11:04:17

标签: python node.js

我正在尝试执行这段执行python脚本的节点js代码。通过此代码工作正常。但响应“运行”和“完成”立即显示在前端。一旦python脚本的执行完成,就必须显示“finshed”。

app.post('/execute', function(request, response){
    response.write("running");
    console.log("executing")
    var pyshell = new PythonShell('./python_codes/test.py')
    pyshell.on('message', function (message) {console.log(message);});
    pyshell.end(function (err) {if (err){throw err;};console.log('finished');});
    response.write("finished");
    response.end();
});

2 个答案:

答案 0 :(得分:1)

这是因为PythonShell类是异步的。您的代码正在做的是创建一个PythonShell对象,将其存储在变量pyshell中,然后向pyshell对象添加一些事件。然后它直接继续写“完成”。

因为写“完成”不是end()函数回调的一部分,所以它立刻就会发生。我看到你至少可以做三件事:

  1. 如果您使用的HTTP库支持它,只需将response.write("finished"); response.end();代码添加到pyshell.end回调。
  2. 使用支持暂停当前执行线程的库(或使用execSync)调用Python。这是不好的做法,因为它违背了使用像node.js这样的并发框架的目的,但是可行。
  3. 使用WebSockets(或 socket.io ,即使WebSockets不可用,例如通过CloudFlare也能正常工作)来传输“已完成”的消息。

答案 1 :(得分:1)

您应该在回调函数

中添加您的响应
app.post('/execute', function(request, response){

  response.setHeader('Connection', 'Transfer-Encoding'); 
  response.setHeader('Content-Type', 'text/html; charset=utf-8');

  response.write("running");
  console.log("executing")
  var pyshell = new PythonShell('./python_codes/test.py')
  pyshell.on('message', function (message) {console.log(message);});
  pyshell.end(function (err) {
    if (err){
      throw err;
    };
    console.log('finished');
    response.write("finished");
    response.end();
  });
});