AWS Lambda Python3.7函数-numpy:无法导入名称'WinDLL'

时间:2019-08-02 20:32:27

标签: python python-3.x numpy lambda boto3

我在 lambda 中设置了一个函数,该函数从 .zip 文件运行python脚本。我已经创建了virtualenv,并将所有必需的程序包包含在 .zip 文件中(来自Lib\site-packages文件夹)。

以下是脚本中使用的软件包的import语句:

import requests
import boto3
import logging
import os
from botocore.exceptions import ClientError
from pprint import pprint
import pandas as pd
from datetime import datetime
import s3fs

当我尝试运行 lambda函数时,出现以下错误:

START RequestId: e302cee0-3c51-453a-84c1-6eb1f9c123a0 Version: $LATEST
[ERROR] Runtime.ImportModuleError: Unable to import module 'export-dev': Unable to import required dependencies:
numpy: cannot import name 'WinDLL' from 'ctypes' (/var/lang/lib/python3.7/ctypes/__init__.py)
END RequestId: e302cee0-3c51-453a-84c1-6eb1f9c123a0
REPORT RequestId: e302cee0-3c51-453a-84c1-6eb1f9c123a0  Duration: 1.65 ms   Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 70 MB  

我没有在代码中明确使用ctypesWinDLL或任何相关软件包。

2 个答案:

答案 0 :(得分:3)

如果您的代码打包的依赖版本不正确,则AWS Lambda会抛出错误,这可能取决于操作系统(lambda在Linux上运行)和python版本。

根据您的要求,是熊猫抛出错误。要在lambda上运行熊猫,您需要包括以下软件包:

熊猫 -为linux编译的代码,这就是lambda运行的代码。您可以在这里https://pypi.org/project/pandas/#files找到它,下载与您的python lambda版本匹配的.whl文件的“ manylinux”版本。

  • 例如如果您正在运行py3.7,则请获取pandas-0.25.3-cp37-cp37m-manylinux1_x86_64.whl

  • .whl文件的内容解压缩到lambda文件夹的根文件夹中。这是lambda所需的库版本

  • 对于0.25+熊猫的注释,您还需要包含pytz软件包,请参见下面有关请求的注释

numpy -现在您可以通过在lambda控制台上安装“图层”来获取lambda(已针对py3.7进行了测试),请参见下面的屏幕截图。

关于请求的注释

  • 请注意,此处https://pypi.org/project/requests/#files的软件包仅具有“无任何”版本,这意味着不需要编译源代码,因此可以安全地包含从pip获得的版本< / p>

  • 这也适用于熊猫对pytz的依赖

在AWS控制台中安装层的屏幕截图

adding a layer im lambda select layer

答案 1 :(得分:0)

由于numpy是用C编写的,因此您应该为Linux发行版构建它。我建议您使用serverless framework,因为当您使用Windows笔记本电脑时,它将大大简化您的生活。

安装serverless framework,并确保您拥有docker

转到项目的根目录并执行:

sls create --template aws-python

安装用于部署python应用程序的插件:

npm install serverless-python-requirements

在您的serverless.yml文件中添加:

plugins:
   - serverless-python-requirements

custom:
  pythonRequirements:
     dockerizePip: non-linux

确保调整lambda函数的路径

functions:
  hello:
    handler: handler.hello

使用正确的库进行部署

sls deploy