Использование child_process spawn на aws lambda для скрипта python

Я пытаюсь запустить сценарий 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, но я переместил код в вызывающую функцию и получил тот же результат.

События data и end будут иметь место длинный после того, как ваш код попадет в return outputString;.

Chris G 13.06.2018 00:52

@ChrisG Не могли бы вы дать мне совет, как это можно исправить? Я предположил, что данные и конечные события работают, так как это работает на моем локальном компьютере.

sun 13.06.2018 00:53

Они «работают» в том смысле, что вы можете видеть вывод на консоль, но не в том смысле, что ваша функция фактически возвращает что-то иное, кроме "starting string". Все, что вы хотите сделать с фактическим выводом, должно происходить в обратном вызове end; вы не можете вернуть его из функции, как вы пытались.

Chris G 13.06.2018 00:59

Возможный дубликат Как мне вернуть ответ от асинхронного вызова?

Chris G 13.06.2018 00:59

@ChrisG Я только что проверил свой код и убедился, что вы правы. Я собираюсь отредактировать свой вопрос, чтобы объяснить это. Спасибо

sun 13.06.2018 01:02

@ChrisG, если вы напишете свой комментарий как решение, я тоже могу отметить его правильным.

sun 13.06.2018 01:18
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
6
1 399
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Из-за асинхронной природы 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

Другие вопросы по теме