【问题标题】:Unable to import module 'lambda_function': No module named 'pandas'无法导入模块“lambda_function”:没有名为“pandas”的模块
【发布时间】:2020-01-01 11:08:56
【问题描述】:

START RequestId:3d5691d9-ad79-4eed-a26c-5bc3f1a23a99 版本:$LATEST 无法导入模块“lambda_function”:没有名为“pandas”的模块
结束请求 ID:3d5691d9-ad79-4eed-a26c-5bc3f1a23a99

我使用 Windows 7 64 位作为主机操作系统。

我想做什么

我只是想在 AWS-Lambda 环境中使用 pandas。就像我在windows环境中使用它一样,我正在为Lambda寻找一个简单的解决方案。

到目前为止我所尝试的

  • 在虚拟盒子上安装了 Xubuntu。
  • 在Xubuntu 中的virtual-box 上创建一个名为myvenv 的虚拟环境。
  • 然后我在myvenv中安装了pandas3.6。
  • 之后,我将myvenv 中位于'/usr/local/lib/python3.6/site-packages/' 的文件夹内容复制到我的主机操作系统。
  • 在主机操作系统(windows 7)中,我创建了一个名为packs的文件夹,粘贴了myvenv的内容。
  • 在主机操作系统(Windows 7)的packs 中创建了lambda_function.py 脚本
  • 然后我使用 7zip 软件将文件夹 packs 压缩并上传为 zipLambda
  • 在 Lambda 中,lambda 函数处理程序名称为 lambda_handler()。代码 sn-p 看起来像,

将熊猫导入为 pd

def lambda_handler(event, context):

    dates = pd.date_range('2019001', periods=6)

    df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
    print(df)
  • 处理程序被命名为lambda_function.lambda_handler。我已授予 lambda-role AWSLambdaFullAccess 权限。
  • 超时设置为 4 分 3 秒。
  • 测试事件的样子

    { "key1": "如果一切正常,这将被打印出来" }

我尝试了以下解决方案:

  • 尝试了来自 here 的 pandas 和 numpy 的预编译 linux 兼容二进制文件——没有运气。
  • 在 Lambda 中,将 Handler info 更改为 python_filename.function_name。就我而言,它是 lambda_function.lambda_handler -- 失败,没有名为 'pandas' 的模块错误
  • 将 lambda 函数放在根文件夹中,使用 7zip 软件压缩文件夹并将文件夹上传到 S3 存储桶。就我而言,我将函数放置在位置 python\lib\python3.6\site_packages\lambda_function.pyfailed with no module named 'pandas' error
  • 已经尝试过发布在SO上的这些相关解决方案,123456

注意:我不想使用 Docker,因为我不知道如何使用它,我也不愿意学习它,因为我现在很生气。我来自 Windows 环境(这很糟糕,我现在知道了。

关于如何让它发挥作用的任何想法。

【问题讨论】:

  • 去过那里,我真的不建议在 Windows 中压缩您的依赖项(权限和所有将是您的问题)。我没有尝试在 lambda 中安装 pandas,但我确实有尝试安装其他库的经验(即psycopg2)。虽然我没有完成您描述的一些困难步骤,但我通常做的只是(1)创建一个文件夹; (2) 在创建的文件夹中添加python文件; (3) 直接在该文件夹上安装依赖项(即pip install -t <folder_path_here> lib1 lib2); (4) Zip all the contents (zip -r lambda.zip .`); (5) 上传zip文件到lambda;
  • @fixatd 感谢您的回复。建议的解决方案是我已经尝试过但没有运气的东西。
  • 啊,一定是您列出的解决方案之一。应该是错过了那个。不能确定为什么你的失败,因为我没有尝试过pandas
  • 从 cli 到 lambda_function.py 所在的文件夹位置和pip install -t . pandas 然后压缩文件夹,上传。
  • @Lamanus 感谢您的回复。建议的解决方案是我已经尝试过但没有运气的东西

标签: python-3.x amazon-s3 aws-lambda aws-lambda-layers


【解决方案1】:

我能够使用 Lambda 层和 Amazon linux Cloud 9 实例成功导入 pandas 库。有我在 Cloud 9 实例中执行的命令和 Lambda 函数的输出。我不得不稍微更改代码,因为它因导入错误和字符串值错误而失败。

或者,这些命令也可以在 EC2 实例中执行。如果无法使用SAM CLI(使用 docker)或只是在 Windows 上使用普通 docker,我们将需要使用Amazon Linux 实例来构建所有内容,因为这就是AWS Lambda uses currently。我不相信在这里使用 ubuntu 实例会起作用。

命令

python --version
Python 3.6.8

# https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html
# python 3.6 uses Amazon Linux currently 

mkdir project
cd project
virtualenv v-env
source ./v-env/bin/activate
pip install pandas
deactivate

# creating layer
# https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-path
mkdir python
cd python
cp -r ../v-env/lib64/python3.6/dist-packages/* .
cd ..
zip -r panda_layer.zip python
aws lambda publish-layer-version --layer-name pandas --zip-file fileb://panda_layer.zip --compatible-runtimes python3.6 

publish-later-version 命令将在命令中指定的区域或 CLI 的config file 中创建一个新的AWS Lambda layer

Lambda 层会将库应用于 Lambda 函数的代码,而无需将其直接应用于部署包。这也允许在 Lambda 中使用在线代码编辑器,因为部署包位于 limit of 3MB

我通过单击 Web 控制台中的图层按钮并选择我最近发布的图层版本来应用 Lambda 图层。我在那里有第二个版本,因为我第一次尝试将lib 目录的内容放入不适用于 64 位操作系统的目录中,并且我的代码在 AWS Lambda 中失败。

或者,您也可以使用 CLI 命令update-function-configuration 应用层

我使用的 Lambda 函数代码

import pandas as pd
import numpy as np

def lambda_handler(event, context):
    dates = pd.date_range(start='1/1/2018', end='1/08/2018')
    df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=list('ABCD'))
    print(str(df))


Lambda 输出

START RequestId: 27f09b6c-a4cd-49dd-bb3e-ae6fc7cd5850 Version: $LATEST
                   A         B         C         D
2018-01-01 -1.040318  0.450841 -0.381687 -0.105480
2018-01-02 -1.381793 -0.481572  0.828419 -0.885205
2018-01-03  1.437799 -0.649816 -0.577112  0.400670
2018-01-04 -0.730997 -0.778775 -1.514203  1.165661
2018-01-05  1.963595 -1.137054  0.920218  0.960210
2018-01-06 -0.429179 -0.745549  1.482562  0.298623
2018-01-07 -1.082388 -0.529476 -1.051663  1.616683
2018-01-08  0.042779 -2.338471 -0.142992  0.680399
END RequestId: 27f09b6c-a4cd-49dd-bb3e-ae6fc7cd5850
REPORT RequestId: 27f09b6c-a4cd-49dd-bb3e-ae6fc7cd5850  Duration: 536.76 ms Billed Duration: 600 ms Memory Size: 128 MB Max Memory Used: 122 MB Init Duration: 1721.51 ms   
XRAY TraceId: 1-5d741e40-1311daa29fc16c74735988fc   SegmentId: 61a595dd3492c331 Sampled: false  

【讨论】:

  • 我用有关该 cli 命令的更多信息更新了我的答案。就我而言,我下载的 pandas 版本适用于 python3,并且在 python3.6 AWS Lambda 函数中成功。还详细阐述了我之前的评论。
  • 感谢您的想法。经过几次失败的实验,使用 lambda、s3、SAM 和其他band of brothers,我终于确定了你的建议。从那时起,生活一直很美好。
  • 这是第一个也是唯一对我有用的解决方案。谢谢!!!
  • 谢谢。我花了 小时 尝试不同的东西,这是唯一对我有用的解决方案。我认为 1) 您使用与 AWS Lambda 使用的操作系统相同的操作系统,即您在 Cloud9 中执行所有操作,2) 在 Lambda 与 Cloud9 中使用相同的 Python 版本,这一点非常重要。我还确保我拥有最新版本的pipsudo python -m pip install --upgrade pip
【解决方案2】:

对于图层方法,请确保上传的图层包(由 virtualenv 生成的站点包)的内容包含在名为 python 的文件夹/目录中。就像你解压缩包后它应该创建一个 python 命名目录并包含站点包的内容。

 cd venv/lib/python3.6
 mkdir python
 cp -r site-packages/* python
 zip layer.zip python

对于依赖在同一个 zip 中的方法,这种结构会有所不同。

【讨论】:

  • 您的回答既缺乏内容又缺乏方向。想详细说明它与所问问题的关系吗?始终欢迎使用替代方法/解决方案,但应详细说明并结合上下文。
  • 在 aws lambda 中创建层时目录的命名很重要,并且在描述中的后续步骤中缺少相同的步骤,因此它是安静相关的。答案是错误背后的可能原因之一。
【解决方案3】:

我发现这个 github 存储库具有预构建的包 ARN。找到您想要的 AWS 区域,然后在创建层时选择“指定 ARN”,然后从这个 github 存储库粘贴到层 ARN:

https://github.com/keithrozario/Klayers

【讨论】:

    最近更新 更多