python-3.x - 无法导入模块 'lambda_function' : No module named 'pandas'

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

START RequestId: 3d5691d9-ad79-4eed-a26c-5bc3f1a23a99 Version: $LATEST Unable to import module 'lambda_function': No module named 'pandas'
END RequestId: 3d5691d9-ad79-4eed-a26c-5bc3f1a23a99



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

我想做的事

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

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

  • import pandas as 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 角色 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.py 失败,没有名为“pandas”的模块错误 .
  • 已经尝试过发布在 SO 上的这些相关解决方案,1 , 2 , 3 , 4 , 5 , 6

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

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

    最佳答案

    我能够使用 Lambda 层和 Amazon linux 成功导入 pandas 库云 9 实例。有我在 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命令将创建一个新的 AWS Lambda layer在命令中给出的区域或 config file对于 CLI。

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

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

    lambda web console

    或者,您也可以使用 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  
    

    关于python-3.x - 无法导入模块 'lambda_function' : No module named 'pandas' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57688731/

    相关文章:

    java - AWS 转录过程完成后调用另一个 lambda

    python - 如何从列表中删除逗号

    python - 如何以编程方式将方法添加到类调用中?

    Python numpy - 列表赋值索引超出范围

    amazon-web-services - 有多个 s3 存储桶还是一个带有子文件夹的存储桶更好?

    amazon-web-services - 如何在AWS S3中添加缓存控制?

    javascript - Angular 工厂 : update scope with progress during upload

    amazon-web-services - 用于查询另一个区域中存在的 DynamoDB 的 lambda 函数?

    Python tnsnames.ora 解析器

    javascript - AWS Lambda 上的 Slack slash 命令延迟响应