【问题标题】:AWS lambda building external dependency libraries in pythonAWS lambda 在 python 中构建外部依赖库
【发布时间】:2017-12-24 01:40:13
【问题描述】:

我正在尝试使用 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 似乎没有正确构建。如果你有 从源代码安装 scikit-learn,请不要忘记构建 使用前打包:运行python setup.py installmake in 源目录。如果您使用了安装程序,请检查 它适用于您的 Python 版本、操作系统和您的 平台。

这是我的 python 源代码,它位于 test.py 中

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

如果我在源代码中导入 numpy,我将面临类似的问题。 (无法导入多数组)

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

Here is the folder structure after I use pip install commands

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

【问题讨论】:

标签: python amazon-web-services numpy lambda scikit-learn


【解决方案1】:

这里可能有两个问题:

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

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

docker run --rm -it \
        -v `pwd`:/code \
        python:2 bash

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

为了解决 2,我总是像这样构建我的 serverless/lambda 项目:

$ tree -L 2
.
├── handler.py
├── lib
│   └── numpy
└── serverless.yml

也就是说,我所有的依赖项都在 lib 中。

pip install -t lib numpy

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

sys.path.insert 之后,您的包的任何导入都将起作用。

【讨论】:

  • 我正在尝试使用解决方案 1。我的库是基于 python docker 映像构建的。如何保存 zip 文件并在我的 Windows 机器上查看它们?
  • 查看我关于 -v 参数的注释。您可能需要参考适用于 Windows 的 Docker 文档。 docs.docker.com/engine/tutorials/dockervolumes
  • whenever you do a pip install -t lib numpy or the like, you will get the correct .so files -> 这不是真的
  • @Jeremy 你能告诉我一个不工作的例子吗?使用 Ubuntu Docker 映像还没有让我失望。老实说,我很想看到这个失败的真实例子......我还没有找到它。
  • @brianz psycopg2 需要编译头文件和运行时 (libpq) 中的 .so。如果你的基本系统中没有 libpq,它就不会工作,因为 psycopg2 是一个 python 包装器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
  • 2018-12-15
相关资源
最近更新 更多