簡體   English   中英

AWS lambda 無法導入模塊“lambda_function”:沒有名為 PIL 的模塊

[英]AWS lambda Unable to import module 'lambda_function': No module named PIL

我正在使用SearchFacesbyimage的 lambda 函數我正在使用這個文檔https://aws.amazon.com/blogs/machine-learning/build-your-own-face-recognition-service-using-amazon-rekognition/

我在哪里使用這個進行比較

from PIL import Image

我收到此錯誤Unable to import module 'lambda_function': No module named PIL

您收到此錯誤是因為 Python 2.x 的 PIL 或 3.x 的 PILLOW 不是 Python lambda 環境中可用的標准庫。

要使用這樣的庫,您必須為您需要的所有庫以及要部署的 python 代碼制作一個自定義部署包。 可以在docker 中或使用EC2實例輕松制作此包。

以下是您將如何在EC2上制作該部署包的過程:

  1. 假設您有名為CreateThumbnail.py的文件

  2. 如果您的源代碼在本地主機上,請將其復制到 EC2。

    scp -i key.pem /path/to/my_code.py ec2-user@public-ip-address:~/CreateThumbnail.py

  3. 通過 SSH 連接到 64 位 Amazon Linux 實例。

    ssh -i key.pem ec2-user@public-ip-address

  4. 使用以下步驟安裝 Python 3.6 和 virtualenv:

    a) sudo yum install -y gcc zlib zlib-devel openssl openssl-devel

    b) wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz

    c) tar -xzvf Python-3.6.1.tgz

    d) cd Python-3.6.1 && ./configure && make

    e) sudo make install f sudo /usr/local/bin/pip3 install virtualenv

  5. 選擇通過 pip3 安裝的虛擬環境

    /usr/local/bin/virtualenv ~/shrink_venv

    源 ~/shrink_venv/bin/activate

  6. 在虛擬環境中安裝庫

    pip安裝枕頭

    pip 安裝 boto3

  7. 將 lib 和 lib64 站點包的內容添加到您的 .zip 文件中。 請注意,以下步驟假設您使用的是 Python 運行時版本 3.6。 如果您使用的是 2.7 版,則需要進行相應的更新。

    cd $VIRTUAL_ENV/lib/python3.6/site-packages

    zip -r9 ~/CreateThumbnail.zip

    注意 - 要包含所有隱藏文件,請使用以下選項:

    zip -r9 ~/CreateThumbnail.zip

  8. 將您的 python 代碼添加到 .zip 文件

    光盤~

    zip -g 創建縮略圖.zip 創建縮略圖.py

現在CreateThumbnail.zip是您的自定義部署包,只需將其復制到 s3 並將其上傳到您的 lambda。

此示例取自https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example-deployment-pkg.html 上的官方 AWS 文檔

盡管文檔清楚地概述了用於為 lambda 函數手動創建 zip 工件的步驟。 此解決方案的可擴展性不是很強。 我一直在使用一個名為juniper的非常小的包來無縫地打包 python lambda 函數。

在您的特定情況下,這是您需要采取的步驟:

假設這是您的文件夾結構:

.
├── manifest.yml
├── src
│   ├── requirements.txt
│   ├── lambda_function.py

在 requirements.txt 中,您將僅包含 lambda 函數的依賴項,在本例中為 PIL 庫。

Pillow==6.0.0

現在,您只需創建一個小文件來告訴瞻博網絡要在 zip 文件中包含哪些內容。 manifest.yml 看起來像:

functions:
  reko:
    requirements: ./src/requirements.txt.
    include:
    - ./src/lambda_function.py

現在您需要在本地環境中pip install juniper 執行cli命令:

juni build

瞻博網絡將創建: ./dist/reko.zip 該文件將包含您的源代碼以及您在 requirements.txt 文件中包含的任何依賴項。

默認情況下,juniper 使用 docker 容器,構建命令將使用 python3.6。 您可以覆蓋該默認值。

我也遇到了這個完全相同的問題。 您可以在此處執行兩個步驟:手動與自動打包和部署。

手動步驟將涉及創建正確的 virtualenv 並在該虛擬環境中安裝依賴項。 然后壓縮所有內容並上傳到 AWS。

為了自動化,我總是更喜歡使用無服務器框架來打包和部署 Lambda 函數。 特別是 python-requirements-plugin 有助於打包。 但是我必須指定以下內容來告訴框架在 docker 容器中構建並且不要剝離任何庫:

custom:
  pythonRequirements:
    dockerizePip: true
    strip: false

正如這里的大多數答案已經提到的那樣,AWS Lambda 執行環境僅包含 Python 內置包和 boto3,除此之外不包含其他任何內容。

要包含外部包,您需要自己包含它們,方法是構建它們並將其包含在您的函數上傳中——或者將它們打包為層。 還要記住,包本身需要為 Amazon Linux 構建。

如果你使用的是 python3.7,那么你可以使用這個公開可用的枕頭層: https : //github.com/keithrozario/Klayers

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM