在aws lambda上为python脚本使用子进程spawn

2024-09-30 20:25:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用我的javascript文件通过孩子运行一个python脚本_进程.spawn系统,但它似乎从未在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文件非常简单,只包含一些print语句:

main pythonfile:

^{pr2}$

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

BEFORE ANY INPUT
NO INPUT CHANGED??
starting string

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

我认为代码似乎很好,因为它可以在我的本地机器上运行,但有一个微妙之处,就是试图让它在AWS上运行,我无法理解。在

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

注意:“getEntities”函数正在被另一个调用节点.js文件,但我把代码移到调用函数,得到了相同的结果。在


Tags: 文件代码pyawsloginputdatavar
1条回答
网友
1楼 · 发布于 2024-09-30 20:25:15

由于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);
});

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

^{pr2}$

我相信有一个更好的方法来做这件事,但这似乎是目前有效的。多亏了克里斯格

相关问题 更多 >