【问题标题】:AWS Lambda python: Unable to import module 'lambda_function': No module named 'regex._regex'AWS Lambda python:无法导入模块“lambda_function”:没有名为“regex._regex”的模块
【发布时间】:2020-10-23 10:17:21
【问题描述】:

我目前正在使用 AWS Lambda。以下是代码的摘录:

import pandas as pd
import re
import nltk
from stop_words import get_stop_words
stopwords = get_stop_words('en')
nltk.download('punkt')
nltk.download('wordnet')
wn = nltk.WordNetLemmatizer()

def lemmatization(txt):
    text = ([wn.lemmatize(word) for word in txt])
    return text

def lambda_handler(event,context):
    
        bucket = "aaabbb"
        key = "cccddd"
        s3_client = boto3.client('s3')
        s3_file = s3_client.get_object(Bucket=bucket, Key=key)
        s3_file_data = s3_file['Body'].read()
        s3_file_data = io.BytesIO(s3_file_data)
        df = pd.read_csv(s3_file_data)

        df['ABC'] = df['ABC'].apply(lambda x: lemmatization(x))
        print(df)

但是,我总是收到错误:

Unable to import module 'lambda_function': No module named 'regex._regex'

我已经导入了 nltk 和 regex 包。你能帮我解决一下吗?

【问题讨论】:

    标签: python-3.x regex aws-lambda nltk


    【解决方案1】:

    一种可能的解决方案是,您的操作系统在下载依赖项时使用的 Python 版本(即 3.6)与您的 Lambda 函数(即 3.7)不同。我建议尝试下载您用于 lambda 脚本的任何 Python 版本,然后例如,如果我希望 Python 版本为 3.8,我将运行代码:
    pip3.8 install -r requirements.txt -t aws-lib

    【讨论】:

    • OP 使用的是 AWS Lambda,你不能只做pip install
    • 这对我有用。我使用 AWS Linux 创建了nltk 层,其中yum install python3 安装了 python 3.7.9,这会导致 OP 在导入时出错。将 Lambda 的运行时修改为 3.7 解决了这个问题。
    【解决方案2】:

    我和你一样面临这个问题。导致此错误的问题是您使用的操作系统和 lambda 函数使用的不同。当 python 安装一个包时,它会根据您使用的操作系统创建已安装的文件。因此,当您使用使用 linux 操作系统创建的部署包时,它将与 lambda 函数一起使用。

    Windows 用户可以通过多种方式执行此操作,但我建议使用 docker 容器来安装您的软件包。

    步骤:

    1. pull python:3.8 docker image(这是撰写此答案时 lambda 支持的最高版本)
    2. 使用将代码挂载到容器的目录作为卷运行您的容器。
    3. 现在在容器内导航到已安装的文件夹并使用 pip 安装所需的包。
    4. 从您的容器中出来,现在使用这些已安装的包来构建您的捆绑包并将其部署在 AWS lambda 上

    ps:现在当你在 windows 上执行代码时会报错,因为安装的包是为 linux OS 构建的

    【讨论】: