从 AWS Lambda /tmp 目录导入 python 包

Imp*_*123 6 python amazon-web-services aws-lambda

我正在尝试将一个 zip 文件上传到 AWS Lambda,该文件主要包含 python 包,大小为 300MB。我清楚地了解,如果我们直接使用 AWS SDK 上传,这超出了可以上传到 Lambda 的 zip 的限制。因此,这是行不通的。

为了克服这个问题,我决定下载/tmp目录中的包并将它们导入到主文件中(参考此处)。我将所需的包压缩为pkgs.zip并将其上传到AWS S3。然后我使用requests将它们解压到 来下载它们/tmp/

def get_pkgs(url):
    import requests
    import io
    import zipfile
    print("Getting Packages...")
    re = requests.get(url)
    z = zipfile.ZipFile(io.BytesIO(re.content))
    print("Extracting Packages...")
    z.extractall("/tmp/")
    print("Packages are downloaded and extracted.")

def attempt_import():
    print("="*50)
    print("ATTEMPT TO IMPORT DEPENDENCIES...")
    print("="*50)
    import numpy
    import scipy
    import six
    print("IMPORTING DONE.")

def main():
    URL = "https://s3-ap-southeast-1.amazonaws.com/BUCKET_NAME/pkgs.zip"
    get_pkgs(URL)
    attempt_import()

def lambda_handler(event, context):
    main()
    return "Hello Lambda"
Run Code Online (Sandbox Code Playgroud)

但是,当我测试 lambda 函数时,它返回一个错误,指出numpy找不到

Import Error: No module named numpy

我的问题是,如何从/tmp/目录导入所需的包?

提前致谢。

小智 3

在导入已下载到该/tmp文件夹​​(例如 文件/tmp/requirements夹)的任何包之前,您必须告诉系统在那里查找依赖项。在代码的开头,就在这些行中:

import sys

sys.path.insert(0, '/tmp/requirements/') # Or any path you desire
Run Code Online (Sandbox Code Playgroud)