【问题标题】:using child_process spawn on aws lambda for a python script在 aws lambda 上为 python 脚本使用 child_process spawn
【发布时间】:2018-06-12 22:48:39
【问题描述】:

我正在尝试通过 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 文件调用,但我将代码移至调用函数,得到相同的结果。

【问题讨论】:

  • dataend 事件将在您的代码命中 return outputString; 后发生 long
  • @ChrisG 你能给我一些关于如何解决这个问题的建议吗?我假设数据和结束事件正在工作,因为这适用于我的本地机器。
  • 它们“工作”的意思是您可以看到控制台输出,但不是因为您的函数实际上返回的不是"starting string"。你想对实际输出做的任何事情都必须在end回调中发生;你不能像你尝试的那样从函数中返回它。
  • @ChrisG 我刚刚测试了我的代码,发现你是对的。我将编辑我的问题来解释这一点。谢谢

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


【解决方案1】:

由于 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

【讨论】:

    猜你喜欢
    • 2016-08-13
    • 1970-01-01
    • 2016-09-21
    • 1970-01-01
    • 2020-12-11
    • 2023-03-19
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    相关资源
    最近更新 更多