我试图通过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文件调用,但是我将代码移动到调用函数,得到了相同的结果。
答案 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