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

Posted

技术标签:

【中文标题】AWS Lambda Python3.7 函数 - numpy:无法导入名称“WinDLL”【英文标题】:AWS Lambda Python3.7 Function - numpy: cannot import name 'WinDLL' 【发布时间】:2019-12-11 11:20:33 【问题描述】:

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

以下是脚本中使用的包的导入语句:

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 或任何相关包。

【问题讨论】:

您是否正在尝试将 Windows 版本的 python 上传到 lambda(即 Linux)? 是的,这似乎是一个版本问题。 Linux 库有时与 Windows 库不同。 requests 肯定是不同的。 【参考方案1】:

如果您的代码未打包正确版本的依赖项,Aws lambda 将向您抛出错误,这可能取决于操作系统(lambda 在 linux 上运行)和 python 版本。

根据您的要求,熊猫会向您抛出错误。要在 lambda 上运行 pandas,您需要包含以下包:

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

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

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

对于 pandas 0.25+ 的注意事项,您还需要包含 pytz 包,请参阅下面的请求注意事项

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

似乎还没有 py3.8 层,所以你需要从 pypi 下载正确的 .whl 文件,就像 pandas https://pypi.org/project/numpy/#files

请求附注

注意这里的包https://pypi.org/project/requests/#files只有一个'none-any'版本,这意味着源不需要编译,所以你可以安全地包含你从pip获得的版本

这也适用于 pandas 的 pytz 依赖

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

【讨论】:

【参考方案2】:

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

安装serverless framework 并确保您拥有docker

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

sls create --template aws-python

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

serverless plugin install -n serverless-python-requirements

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

plugins:
   - serverless-python-requirements

custom:
  pythonRequirements:
     dockerizePip: non-linux

确保调整 lambda 函数的路径

functions:
  hello:
    handler: handler.hello

使用正确的库部署

sls deploy 

【讨论】:

这就是我所做的,但仍然遇到同样的错误。除了 numpy(我只需要 pandas)之外,其他一切都有效。 @KMFR 你确定 docker 正在运行吗? @KMFR 我更新了我的答案,以便您使用serverless plugin install -n serverless-python-requirements 而不是npm install serverless-python-requirements。像这样,python 插件在无服务器文件中指定。

以上是关于AWS Lambda Python3.7 函数 - numpy:无法导入名称“WinDLL”的主要内容,如果未能解决你的问题,请参考以下文章

从 AWS API Gateway Web 界面配置 AWS Lambda 时无法选择/查看 Lambda 函数

AWS Lambda Invoke 不执行 lambda 函数

AWS Lambda 无法调用没有 VPC 的另一个 AWS Lambda - NodeJs

AWS lambda 函数调用另一个带参数的 lambda 函数

是否可以重命名 AWS Lambda 函数?

AWS Lambda 函数帮助