【问题标题】:Pandas in AWS lambda gives numpy errorAWS lambda 中的 Pandas 给出了 numpy 错误
【发布时间】:2017-10-08 05:30:37
【问题描述】:

我一直在尝试在导入 pandas 的 AWS Lambda 中运行我的代码。这就是我所做的。 我有一个 python 文件,其中包含如下简单代码(此文件具有 lambda 处理程序)

import json
print('Loading function')
import pandas as pd
def lambda_handler(event, context):
    return "Welcome to Pandas usage in AWS Lambda"
  1. 我已将此 python 文件与 numpy、pandas 和 pytz 库一起压缩为部署包(所有这些都在 Amazon EC2 linux 机器中完成)
  2. 然后将包上传到S3
  3. 创建了一个 lambda 函数 (runtime=python3.6) 并从 S3 上传了部署包

但是当我在 AWS Lambda 中测试 lambda 函数时,出现以下错误:

Unable to import module 'lambda_function': Missing required dependencies ['numpy']

我已经在压缩包中有 numpy,但我仍然收到此错误。我尝试按照Pandas & AWS Lambda 给出的提示进行操作,但没有成功。

有没有人遇到过同样的问题。希望有任何解决此问题的提示或建议。

谢谢

【问题讨论】:

  • 哇,我不知道这这么简单(我一直在用 vanilla python 为 aws lambda 编写我自己的类似 pandas 的助手)。
  • 你在那台 amazon linux 机器上编译过 pandas、numpy 等吗?因为你需要在那里编译它们,而不仅仅是 zip。
  • @AdamOwczarczyk 感谢您的回复。我花了很多时间来弄清楚如何编译/构建包。在这次尝试中,我关注了这篇博文 (blog.datapolitan.com/2015/08/25/…)。但还是不走运:(
  • Pandas & AWS Lambda的可能重复
  • 对于未来的读者:很多人似乎导入 pandas 或 numpy 来执行琐碎的列表转换,却没有意识到这些库有多大和过度杀伤力。通常,您可以使用现有的 Python 列表功能完全避免它们。使用 AWS Lambda 是一个更好的选择。

标签: python pandas numpy amazon-s3 aws-lambda


【解决方案1】:

编辑:我终于想通了如何在 AWS Lambda python 3.6 运行时环境中运行 pandas 和 numpy。

我已将我的部署包上传到以下存储库:

git clone https://github.com/pbegle/aws-lambda-py3.6-pandas-numpy.git

只需通过运行将您的 lambda_function.py 添加到 zip 文件中:

zip -ur lambda.zip lambda_function.py

上传到 S3 并源到 lambda。

原文:

让 Pandas 在 lambda 函数中工作的唯一方法是按照 this blog post 中的步骤在 AWS Linux EC2 实例中编译 pandas(和 numpy)库,然后为我的 lambda 函数使用 python 2.7 运行时.

【讨论】:

  • 很想知道如何在 python 3.6 运行时环境中完成它,但如果有人弄清楚的话!
  • 你能解释一下你是怎么做到的吗?我希望能够将其扩展到其他包。谢谢!
  • 我写了一篇关于如何做到这一点的博文。看看:medium.com/i-like-big-data-and-i-cannot-lie/…
  • 我现在遇到了类似的问题。只需从此 repo 中获取所有子文件夹并与我尝试上传的 lambda 一起使用。这也有效
【解决方案2】:

要在您的 lambda zip 中包含 numpy,请按照 AWS 文档中此页面上的说明进行操作...

How do I add Python packages with compiled binaries to my deployment package and make the package compatible with AWS Lambda?

以 numpy 为例解释说明:

  1. 在 pypi.org 打开模块页面。 https://pypi.org/project/numpy/
  2. 选择下载文件。

  3. 下载:

对于 Python 2.7,模块名称-版本-cp27-cp27mu-manylinux1_x86_64.whl

例如numpy-1.15.2-cp27-cp27m-manylinux1_x86_64.whl

对于 Python 3.6,模块名称-版本-cp36-cp36m-manylinux1_x86_64.whl

例如numpy-1.15.2-cp36-cp36m-manylinux1_x86_64.whl

  1. 解压 /path/to/project-dir 文件夹中的 wheel 文件。 您可以在命令行上使用 unzip 命令来执行此操作。显然还有其他方法。

unzip numpy-1.15.2-cp36-cp36m-manylinux1_x86_64.whl

wheel 文件解压后,您的部署包将与 Lambda 兼容。

希望一切都有意义;)

最终结果可能看起来像这样。 注意:您不应该在部署包中包含 whl 文件。

【讨论】:

  • 我面临同样的问题,当我像这样复制 numpy 时,pandas 给出了这个错误 - C 扩展:没有构建名为“pandas._libs.tslibs.conversion”的模块。如果您想从源目录导入 pandas,您可能需要先运行“python setup.py build_ext --inplace --force”来构建 C 扩展。 -- 关于这个的任何想法
  • 我按照本教程一步一步地做了同样的事情,但我没有成功aws.amazon.com/premiumsupport/knowledge-center/…。所以我也跟着这个 AWS 官方教程,所以我又遇到了同样的问题:aws.amazon.com/premiumsupport/knowledge-center/…。我不知道该怎么办了。有什么想法?我正在使用 Mac OS。
  • 这对我有用!我一直在 AWS Lambda 中使用 Python3.7 运行时环境,而不是其他人似乎都在使用的 Python3.6。无论如何,我刚刚下载了 numpy cp37-cp37m-manylinux_x86_64.whl,然后我解压缩它,然后我的lambda_function.py、numpy 目录和numpy.dist-info 目录都有一个压缩包!上传,然后砰!都很好。无需通过 EC2 安装,无需 docker。简单明了,我喜欢它!
  • @Dimuthu 有什么解决办法吗?我也面临同样的问题
【解决方案3】:

经过大量研究,我能够使其与 Lambda 层一起使用。

创建或打开一个干净的目录并按照以下步骤操作:

先决条件:确保您已启动并运行 Docker

  1. 使用以下内容创建 requirements.txt 文件:
pandas==0.23.4
pytz==2018.7
  1. 使用以下内容创建 get_layer_packages.sh 文件:
#!/bin/bash

export PKG_DIR="python"

rm -rf ${PKG_DIR} && mkdir -p ${PKG_DIR}

docker run --rm -v $(pwd):/foo -w /foo lambci/lambda:build-python3.6 \
    pip install -r requirements.txt --no-deps -t ${PKG_DIR}
  1. 在同一目录下运行以下命令:
chmod +x get_layer_packages.sh

./get_layer_packages.sh

zip -r pandas.zip .
  1. 将图层上传到 S3 存储桶。

  2. 通过运行以下命令将层上传到 AWS:

aws lambda publish-layer-version --layer-name pandas-layer --description "Description of your layer"
--content S3Bucket=<bucket name>,S3Key=<layer-name>.zip
--compatible-runtimes python3.6 python3.7
  1. 转到 Lambda 控制台并将您的代码上传为 zip 文件或使用内联编辑器。

  2. 点击图层 > 添加图层> 从兼容图层中搜索图层(pandas-layer)并选择版本。

  3. 还添加 AWSLambda-Python36-SciPy1x 层,默认情况下可用于导入 numpy。

Selecting the layer from the console

  1. 测试代码。它现在应该可以工作了!!!!

感谢这篇中篇文章https://medium.com/@qtangs/creating-new-aws-lambda-layer-for-python-pandas-library-348b126e9f3e

【讨论】:

    【解决方案4】:

    AWS Lambda use Amazon Linux 操作系统。想法是下载Pandas 和NumPy 与Amazon Linux 兼容。您使用 pip 下载的内容特定于 Windows 或 Mac。您需要下载适用于 Linux 的兼容版本,以便您的 Lambda 函数能够理解它。这些文件称为wheel 文件。

    使用lambda_function.py 文件创建新的本地目录。使用 pip 将 Pandas 安装到本地目录:

    $ pip install -t . pandas
    

    导航到https://pypi.org/project/pandas/#files。搜索并下载最新的*manylinux1_x86_64.whl 包。就我而言,我在我的 Lambda 函数上使用 Python 3.6,所以我下载了以下内容:

    将 whl 文件下载到带有lambda_function.py 的目录。删除 pandas、numpy 和 *.dist-info 目录。解压 whl 文件。

    $ rm -r pandas numpy *.dist-info
    $ unzip numpy-1.16.1-cp36-cp36m-manylinux1_x86_64.whl
    $ unzip pandas-0.24.1-cp36-cp36m-manylinux1_x86_64.whl
    

    删除 whl 文件,*.dist-info 和 __pycache__。准备zip.zip存档:

    $ rm -r *.whl *.dist-info __pycache__
    $ zip -r zip.zip .
    

    在您的 Lambda 函数中上传 zip.zip 文件。

    来源:https://medium.com/@korniichuk/lambda-with-pandas-fd81aa2ff25e

    【讨论】:

      【解决方案5】:

      要在 Lambda 中获取其他库,我们需要在 Amazon Linux 上编译它们(如果底层库是基于 C 或 C++ 的,例如 Numpy,这很重要)并将它们与您想要的 python 脚本一起打包到 ZIP 文件中在 Lambda 中运行。

      获取库的 Amazon Linux 编译版本。您可以找到某人已经编译的版本,例如 @pbegle 的版本,或者自己编译。要自己编译,有两种选择: - 在 EC2 实例上编译库 https://streetdatascience.com/2016/11/24/using-numpy-and-pandas-on-aws-lambda/ - 在 Lambda 环境的 docker 版本上编译库 https://serverlesscode.com/post/scikitlearn-with-amazon-linux-container/

      在使用 Docker 的最后一个选项之后,可以使用上面博客文章中的说明并添加:

      pip install --use-wheel pandas
      

      在脚本中编译库:

      https://github.com/ryansb/sklearn-build-lambda/blob/master/build.sh#L21

      【讨论】:

      • 我已经尝试过了,但生成的 zip 文件大约为 55MB。有什么更新吗?
      【解决方案6】:

      主要问题是在特定操作系统中编译的库仅适用于该操作系统。所以,如果一个库是在 macOS 中编译的,那么它将不会在 Linux 环境中运行。为什么会出现这个问题?

      Pandas 的依赖项之一是 Numpy(由于速度原因编译,see this answer on stackoverflow)。 AWS Lambda 使用 Linux,因此如果 Numpy 编译是在 macOS 或 Windows 中完成的,那么编译将只适用于那些特定的架构,而不会在 AWS 中工作。我认为使用 Linux 的人不会遇到这个问题。

      要解决此问题并为 Pandas 创建一个有效的 AWS Lambda 层,请执行以下简单步骤 (see the general steps on amazon forum):

      mkdir awsPandasLayer #create a directory
      cd awsPandasLayer #cd into the directory
      pip3 install -t . Pandas #install pandas and all its dependencies 
      rm -r pandas numpy *.dist-info __pycache__ #clean up the environment to remove the incompatible numpy and pandas
      

      然后将 Pandas 和 Numpy 的最新预编译包下载到之前创建的 awsPandasLayer 目录中。就我而言,由于我使用的是 Python 3.7,因此我下载了 Pandas 和 Numpy 的这些版本。注意 cp37 表示网站上明确说明的 python 版本。然后如下完成安装:

      unzip pandas-1.0.5-cp37-cp37m-manylinux1_x86_64.whl #unzip the pandas precompiled package
      unzip numpy-1.18.5-cp37-cp37m-manylinux1_x86_64.whl #unzip the numpy precompiled package
      pip3 install -t . openpyxl #I found this is required within AWS Lambda for excel files
      rm -r *.whl *.dist-info __pycache__ #clean up unneeded files
      zip -r awsPandasLayer.zip . # zip all the files
      

      然后可以将 zip 文件作为 AWS Lambda 层上传,它应该可以工作。请注意,我使用的是 macOS。

      【讨论】:

        【解决方案7】:

        与Cannot find MySQL in NodeJS using AWS Lambda略有重复

        您需要使用 Lambda 打包您的库。由于 lambda 在公共云上运行,因此您无法对其进行配置。

        现在,在您使用 pandas 的情况下,您需要将 Pandas 与您的 zip 打包在一起。获取 pandas 的路径(例如:/Users/dummyUser/anaconda/lib/python3.6/site-packages)并将库复制到您拥有 lambda 函数代码的位置。在您的代码中,请参阅本地副本中的 pandas。上传时,压缩整个集合(代码+库),然后随意上传。它应该可以工作。

        【讨论】:

        • 这是我所做的,但它仍然丢失
        【解决方案8】:

        我在这里尝试了一些解决方案,但大多数都不起作用。我喜欢@Ranadeep Guha 建议创建一个容器并在那里下载存储库的想法,这就是我所做的。

        我在我的 lambda 函数所在的目录中工作并创建了以下文件:

        Docker 文件:

        FROM python:3.8-slim
        WORKDIR /app
        COPY requirements.txt ./
        RUN pip install --no-cache-dir -r requirements.txt -t /app
        

        requirements.txt:(那些是我的)

        pandas
        numpy
        xmltodict
        

        现在在我的 gitbash 中运行以下命令,该命令将为我生成一个安装了所有依赖项的 docker 映像:

        docker build -t image_name .
        
        Sending build context to Docker daemon  5.632kB
        Step 1/4 : FROM python:3.8-slim
         ---> 56930ef6f6a2
        Step 2/4 : WORKDIR /app
         ---> Using cache
         ---> ea0bf539bcad
        Step 3/4 : COPY requirements.txt ./
         ---> cb4c005f53cc
        Step 4/4 : RUN pip install --no-cache-dir -r requirements.txt -t /app
         ---> Running in a0d179a372b4
        Collecting pandas
          Downloading pandas-1.0.3-cp38-cp38-manylinux1_x86_64.whl (10.0 MB)
        Collecting numpy
          Downloading numpy-1.18.3-cp38-cp38-manylinux1_x86_64.whl (20.6 MB)
        Collecting xmltodict
          Downloading xmltodict-0.12.0-py2.py3-none-any.whl (9.2 kB)
        Collecting pytz>=2017.2
          Downloading pytz-2020.1-py2.py3-none-any.whl (510 kB)
        Collecting python-dateutil>=2.6.1
          Downloading python_dateutil-2.8.1-py2.py3-none-any.whl (227 kB)
        Collecting six>=1.5
          Downloading six-1.14.0-py2.py3-none-any.whl (10 kB)
        Installing collected packages: numpy, pytz, six, python-dateutil, pandas, xmltodict
        Successfully installed numpy-1.18.3 pandas-1.0.3 python-dateutil-2.8.1 pytz-2020.1 six-1.14.0 xmltodict-0.12.0
        

        现在只需为该映像创建一个 Docker 容器并确认已安装所有内容:

        winpty docker run --name container_name -it --entrypoint bash image_name
        

        键入 ls,您将看到所有安装。

        现在让我们将所有安装复制到您的本地电脑。您可以将点替换为您电脑上的任何位置:

         docker cp container_id:/app/* . 
        

        【讨论】:

          【解决方案9】:

          使用来自这些答案和 SO 55695187 的想法,我为 AWS Lambda 构建了一个包含 pandas 的层,并在 github 上提供了它。它具有适用于 Python 3.8 的 pandas v 1.3.1。见https://github.com/eoneil1942/pandas。这是我所做的:

          Created an ec2 instance for AWS Linux
          Installed python3.8, pip3, used pip3 to install pandas
          Made an empty directory python/lib/python3.8/site-packages
          Copied pandas and pytz from installed site-packages to this one
          zip -r pandas.zip python
          

          显然,这可以推广到任何 Python 包。

          【讨论】:

            【解决方案10】:

            这对我有用:

            1. 在 lambda 代码中仅导入库(不推送 .zip 中的库):

              from scipy.stats import norm

              import pandas as pd

              ...

            2. 然后在 lambda 控制台中,使用 ARN 选项添加层:

              Scipy-numpy: arn:aws:lambda:us-east-1:668099181075:layer:AWSLambda-Python38-SciPy1x:29

              熊猫: arn:aws:lambda:us-east-1:770693421928:layer:Klayers-python38-pandas:42

            3. 测试你的 lambda。

            【讨论】:

              【解决方案11】:

              我在尝试使用 python3.6 引擎时遇到了类似的错误。当我切换到 2.7 时,它对我来说效果很好。我使用 Amazon AMI 创建我的 zip 文件,但它只有 python3.5,而不是 3.6。我想版本不匹配是原因。不过这只是一个猜测,我还没有在python3.6安装上尝试过这个过程。

              【讨论】:

                【解决方案12】:

                使用serverless framework,您可以轻松正确地打包和部署您的依赖项。

                你只需要;

                1. 安装无服务器

                  npm install -g serverless
                  
                2. 在项目的根目录中创建一个 serverless.yml,使用以下内容:

                  service: numpy-test
                  
                  # define the environment of your lambda
                  provider:
                    name: aws
                    runtime: python3.6
                  
                  # specify the function you want to deploy
                  functions:
                    numpy:
                      # path to your lambda_handler function
                      handler: path/to/function.lambda_handler
                  
                  # add a plugin that allows serverless to package python libraries
                  # specified in the requirements.txt or Pipfile
                  plugins:
                    - serverless-python-requirements
                  
                  # this section makes sure your libraries get build correctly 
                  # for an aws lambda environment
                  custom:
                    pythonRequirements:
                      dockerizePip: non-linux
                  

                  调整路径/to/function.lambda_handler

                3. 确保 docker 正在运行并执行

                  serverless deploy

                部署完成后,前往 AWS 控制台查找函数 numpy-test-dev-numpy 并测试您的函数。

                this article详细解释了必要的步骤。

                【讨论】:

                  【解决方案13】:

                  这类似于 Randeep 的回答,但如果您不想这样做,则不需要使用 Lambda 层。

                  正如其他人所说,这不起作用,因为 pandas/numpy 需要构建二进制文件,并且您的构建机器(Linux、Mac、Windows)的操作系统与 Lambda(Amazon Linux)的操作系统不匹配。

                  要解决这个问题,您可以使用 docker 下载/构建您的依赖项并将它们打包到 Amazon Linux 上。亚马逊为此提供了一个 Docker 镜像。请参阅下文,了解我如何为 Python 3.6 运行时构建我的 python 包(他们为所有其他运行时提供其他 docker):

                  将所有依赖项放入requirements.txt 文件中,例如:

                  openpyxl
                  boto3
                  pandas
                  

                  创建一个脚本(即命名为build.sh)来构建你的包,这是我的样子:

                  #!/bin/bash
                  
                  # remove old build artifacts
                  rm -rf build
                  rm lambda_package.zip
                  
                  # make build dir and copy my lambda handler file into it
                  mkdir build
                  cp lambda_daily_util_gen.py  build/
                  
                  # Use requirements file to download/build dependencies into the build folder
                  cd build
                  pip install -r ../requirements.txt --target .
                  
                  # Create an lambda package with my files and all dependencies
                  zip -r9 ../lambda_package.zip .
                  

                  确保您已拉取 Amazon Linux lambda 构建映像:

                  $ docker pull lambci/lambda
                  

                  在 docker 容器内运行构建脚本:

                  窗户:

                  $ docker run --rm -v "$PWD":/var/task lambci/lambda:build-python3.6 /var/task/build.sh
                  

                  Mac/Linux:

                  docker run --rm -v ${PWD}:/var/task lambci/lambda:build-python3.6 chmod +x build.sh;./build.sh
                  

                  您现在应该会看到一个名为 lambda_package.zip 的文件,该文件是在您可以上传到 AWS 的 Amazon Linux 上构建的。

                  希望对您有所帮助。

                  【讨论】:

                    【解决方案14】:

                    也许您正在使用的模块适用于 python 2.7。

                    尝试为 python 3.x 安装 pandas 模块

                    即

                    pip3 安装 pandas -t .

                    它对我有用。

                    或者为了即时结果,将运行时更改为 python 2.7 (不推荐)

                    【讨论】:

                      【解决方案15】:

                      要制作与 Lambda 兼容的部署包,请下载一个名为 wheel (.whl) 的预编译包。解压缩 /path/to/project-dir 上的 wheel 文件而不是使用 pip install。

                      分辨率

                      1. 打开您的模块名称 pypi.org 页面。例如: https://pypi.org/project/numpy/

                      2. 选择下载文件。

                      3. 下载:

                      对于 Python 2.7,模块名称-版本-cp27-cp27mu-manylinux1_x86_64.whl 对于 Python 3.6,模块名称-版本-cp36-cp36m-manylinux1_x86_64.whl 4.解压/path/to/project-dir文件夹下的wheel文件。

                      wheel 文件解压后,您的部署包将与 Lambda 兼容。

                      【讨论】:

                        【解决方案16】:

                        这是唯一对我有用的东西:Python packages in AWS Lambda made easy

                        解释他们做了什么,这是您需要遵循的步骤的一个小摘要:

                        1 - 在 Linux 实例中安装软件包

                        与提到的其他用户一样,您需要在 linux 实例中安装库以确保它与您的 Lambda 函数一起使用。您可以使用 AWS Cloud9 服务来执行此操作。

                        • 转到 AWS 中的 Cloud9 并单击 创建环境
                        • 为环境命名,选择一个 t2.micro 并将其余设置保留为默认设置:
                        • 点击下一步查看设置,最后点击创建环境

                        2 - 创建熊猫图层

                        在新环境下,使用下面的代码安装panda库(包括numpy):

                        (注意:你可以安装多个模块)

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

                        键入下一个代码以压缩必要的文件并将图层版本发布到您的 aws 帐户:

                        mkdir python
                        cd python
                        cp -r ../v-env/lib64/python3.7/site-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.7
                        

                        3 - 将图层添加到您的 lambda

                        完成第 2 步后,您将在 aws 的 Lambda 部分中拥有一个名为 pandas 的层(您可以在左侧菜单中看到它)。确保您为 lambda 选择了 Runtime 3.7:

                        在您的 Lambda 配置中单击页面底部的添加层,然后选择您刚刚创建的新层。

                        您可以通过导入 numpy 和 pandas 来测试 Lambda。你会发现你可以很好地执行它。

                        最后:

                        记得删除您的 Cloud9 环境!您可以转到 AWS Cloud9 部分并通过选择它并单击删除来删除之前创建的环境。它应该终止与其关联的 EC2 实例,但要确保,请转到 AWS 中的 EC2 部分并检查实例状态是否为已终止。如果没有,请单击它并在 Instance state 上选择 Terminate instance。

                        请务必查看上述指南以支持他们的工作。

                        【讨论】:

                          【解决方案17】:

                          您的代码总是出现此错误
                          因为 lambda 不包含任何外部库,它有一个默认情况下随 Python 提供的库。

                          如果您使用任何外部库,如 pandas、numpy 或任何其他库。您需要在 Aws Lambda 上安装该库
                          使用前

                          代码见

                          import json
                          print('Loading function')
                          import pandas as pd
                          def lambda_handler(event, context):
                              return "Welcome to Pandas usage in AWS Lambda"
                          

                          这里没有安装 pandas 库,因此您的代码无法正常工作。
                          我的建议是使用您的代码,如下所示。在 lambda 函数中编写所有代码

                          import json
                          def lambda_handler(event, context):
                              #install python libray here 
                              print('Loading function')
                              import pandas as pd
                              return "Welcome to Pandas usage in AWS Lambda" 
                          

                          所以最终代码如下所示

                           def lambda_handler(event, context):
                               import pip
                          
                              def install(package):
                                  if hasattr(pip, 'main'):
                                      pip.main(['install', package])
                                  else:
                                      pip._internal.main(['install', package])
                          
                              if __name__ == '__main__':
                                  install('pandas')
                          
                              #install python libray here 
                              print('Loading function')
                              import pandas as pd
                              return "Welcome to Pandas usage in AWS Lambda" 
                          

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 2016-09-05
                            • 2022-09-30
                            • 2019-01-01
                            • 2021-10-12
                            • 2022-01-01
                            • 2019-08-30
                            • 1970-01-01
                            相关资源
                            最近更新 更多