Я пытаюсь запустить сценарий python, используя свой файл javascript через систему child_process.spawn, но, похоже, он никогда не запускается на лямбда-выражении aws.
Соответствующий код:
getEntities: function (){
var spawn = require('child_process').spawn;
var py = spawn('python', ['mainPythonFile.py']);
var outputString = "starting string";
console.info("BEFORE ANY INPUT");
py.stdout.on('data', function (data) {
console.info("----Getting information from the python script!---");
outputString += data.toString();
console.info(outputString);
});
py.stdout.on('end', function (){
console.info("===hello from the end call in python files== = ");
console.info("My output : " + outputString);
});
console.info("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, но я переместил код в вызывающую функцию и получил тот же результат.
@ChrisG Не могли бы вы дать мне совет, как это можно исправить? Я предположил, что данные и конечные события работают, так как это работает на моем локальном компьютере.
Они «работают» в том смысле, что вы можете видеть вывод на консоль, но не в том смысле, что ваша функция фактически возвращает что-то иное, кроме "starting string". Все, что вы хотите сделать с фактическим выводом, должно происходить в обратном вызове end; вы не можете вернуть его из функции, как вы пытались.
Возможный дубликат Как мне вернуть ответ от асинхронного вызова?
@ChrisG Я только что проверил свой код и убедился, что вы правы. Я собираюсь отредактировать свой вопрос, чтобы объяснить это. Спасибо
@ChrisG, если вы напишете свой комментарий как решение, я тоже могу отметить его правильным.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Из-за асинхронной природы JS, как объяснил Крис, функция достигает оператора «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
События
dataиendбудут иметь место длинный после того, как ваш код попадет вreturn outputString;.