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
我没有在我的代码中明确使用ctypes
、WinDLL
或任何相关包。
【问题讨论】:
您是否正在尝试将 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