在aws lambda上使用child_process spawn获取python脚本

时间:2018-06-12 22:48:39

标签: javascript python node.js amazon-web-services child-process

我试图通过child_process.spawn系统使用我的javascript文件运行python脚本,但它似乎永远不会在aws lambda上运行。

相关代码是:

getEntities: function (){
    var spawn = require('child_process').spawn;
    var py = spawn('python', ['mainPythonFile.py']);
    var outputString = "starting string";

    console.log("BEFORE ANY INPUT");
    py.stdout.on('data', function (data) {
        console.log("----Getting information from the python script!---");
        outputString += data.toString();
        console.log(outputString);
    });

    py.stdout.on('end', function (){
        console.log("===hello from the end call in python files===");
        console.log("My output : " + outputString);
    });
    console.log("NO INPUT CHANGED??");

    return outputString;

}

这些文件与文件夹结构(表面级别)处于同一级别。

正在运行的python文件非常简单,只包含一些打印语句:

MainPythonFile:

import sys;
print("Hello There");
print("My name is Waffles");
print("Potato Waffles");
sys.stdout.flush()

我从aws服务获得的输出是:

BEFORE ANY INPUT
NO INPUT CHANGED??
starting string

我尝试访问python文件时尝试了不同的路径,例如 *mainPythonFile.py ./mainPythonFile.py等。

我认为代码似乎很好,因为这适用于我的本地计算机,但尝试让它在AWS上运行是我无法理解的一个微妙之处。

如果需要,我可以提供任何其他信息。

注意:" getEntities"函数被另一个node.js文件调用,但是我将代码移动到调用函数,得到了相同的结果。

1 个答案:

答案 0 :(得分:0)

由于JS的异步性质,正如Chris所解释的那样,函数在实际调用生成线程中的“end”之前到达“return”语句。

这意味着代码永远不会有机会实际设置正确的输出文本。

我更改了函数调用以接受回调,然后在程序回复信息时响应。

我的新功能稍微改为此(没有打印):

getEntities: function(callbackFunction, that){
var spawn = require('child_process').spawn;
var py = spawn('python', ['mainPythonFile.py']);
var outputString = "starting string";

py.stdout.on('data', function (data) {
    outputString += data.toString();
});
// that = "this == alexa" that's passed in as input.
py.stdout.on('end', function (){
    callbackFunction(outputString, that);
});

调用此函数的函数现在如下:

HelperFunctions.getEntities(function(returnString,that){
  that.response.speak(returnString);
  that.emit(':responseReady');
}, this);

我确信有更好的方法可以做到这一点,但这似乎现在正在发挥作用。感谢ChrisG