AWS Lambda在python中构建外部依赖库

Reg*_*sor 3 python lambda numpy amazon-web-services scikit-learn

我正在尝试使用Python创建一个AWS Lambda函数。我想要创建一个zip部署程序包,然后将其上传到我的AWS环境中,而不是一个内联函数。我的源代码位于test.py文件中,而其他依赖项(如numpy,sklearn等)与源代码位于同一文件夹中。

我测试我的lambda函数时遇到错误。

无法导入模块'test':没有名为'sklearn .__ check_build._check_build'的模块___________________________________________________________________________ / var / task / sklearn / __ check_build的内容:setup.py
__pycache__ _check_build.cp36-win_amd64.pyd __init__.py ____________________________________________学习尚未正确构建。如果您已经从源代码安装了scikit-learn,请不要忘记在使用之前构建该软件包:运行python setup.py installmake在源目录中。如果您使用了安装程序,请检查它是否适合您的Python版本,操作系统和平台。

这是我驻留在test.py中的python源代码

from sklearn.model_selection import train_test_split
print('Loading function')


def lambda_handler(event, context):
    #print("Received event: " + json.dumps(event, indent=2))
    print("value1 is " + event['key1'])
    print("value2 is " + event['key2'])
    print("value3 is " + event['key3']) 
    return event
Run Code Online (Sandbox Code Playgroud)

如果我在源代码中导入numpy,则会遇到类似的问题。(无法导入多数组)

我正在使用安装每个库pip install numpy/scikit-learn -t /path/to/mydir/

这是我使用pip install命令后的文件夹结构

请帮助我解决问题。谢谢 !!

bri*_*anz 5

这里可能有两个问题:

  1. C需要pip install在具有与Lambda函数运行的体系结构相同的体系结构的机器上构建()具有绑定的Python软件包。
  2. 使用AWS Lambda,您有责任管理Python的路径,以便它可以找到您的依赖项。您可能需要在运行时更新路径。

为了解决#1,我使用了官方的Python Docker镜像。

docker run --rm -it \
        -v `pwd`:/code \
        python:2 bash
Run Code Online (Sandbox Code Playgroud)

现在,无论您执行什么操作pip install -t lib numpy或类似操作,都将获得正确的.so文件。这里的技巧是使用volume参数(-v),这样当您关闭容器时,该lib目录将保留在您的主机上。

为了解决2,我总是像这样构造我的无服务器/ lambda项目:

$ tree -L 2
.
??? handler.py
??? lib
?   ??? numpy
??? serverless.yml
Run Code Online (Sandbox Code Playgroud)

也就是说,我所有的依赖项都进入了内部lib

pip install -t lib numpy
Run Code Online (Sandbox Code Playgroud)

在的顶部handler.py,我总是有以下4行:

import os
import sys

CWD = os.path.dirname(os.path.realpath(__file__))
sys.path.insert(0, os.path.join(CWD, "lib"))

# now it's ok to import extra libraries
import numpy as np
Run Code Online (Sandbox Code Playgroud)

之后sys.path.insert,任何进口你的包会工作。