无法导入模块“ lambda_function”:没有名为“ pandas”的模块

时间:2019-08-28 09:04:53

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

  

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

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

我想做什么

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

到目前为止我尝试过的一切

  • 在虚拟盒子上安装了Xubuntu。
  • 在虚拟框上的Xubuntu中创建一个名为myvenv的虚拟环境。
  • 然后,我在myvenv中安装了pandas3.6。
  • 此后,我将文件夹myvenv'/usr/local/lib/python3.6/site-packages/'中的文件夹内容复制到了主机OS​​。
  • 在主机操作系统(Windows 7)中,我创建了一个名为packs的文件夹,粘贴了myvenv的内容。
  • 在主机操作系统(Windows 7)的lambda_function.py中创建了一个packs脚本
  • 然后我使用7zip软件压缩文件夹packs并将其以zip的形式上传到Lambda
  • 在Lambda中,lambda函数处理程序的名称为lambda_handler()。该代码段如下所示:
  

将熊猫作为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.py 失败,没有名为“ pandas”的模块错误
  • 已经尝试过在SO 123456

注意:我不想使用Docker,因为我不知道如何使用它,而且由于现在我很生气,所以我不愿意学习它。我来自Windows环境(很烂,我现在知道。

有关如何使其正常工作的任何想法。

1 个答案:

答案 0 :(得分:1)

我能够使用Lambda层和Amazon linux Cloud 9实例成功导入熊猫库。有一些我在Cloud 9实例中执行的命令以及Lambda函数的输出。我必须稍稍更改代码,因为它由于导入错误和字符串值错误而失败。

或者,这些命令也可以在EC2实例中执行。如果无法在Windows上使用SAM CLI(使用docker)或仅使用普通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的AWS Lambda layer中给定的区域中创建新的config file

Lambda层会将库应用于Lambda函数的代码,而无需直接将其应用于部署包。由于部署程序包位于limit of 3MB

下,因此这也允许在Lambda中使用在线代码编辑器。

我通过单击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