【问题标题】:AWS python lambda function:No module named requestsAWS python lambda函数:没有名为请求的模块
【发布时间】:2018-04-10 00:11:45
【问题描述】:

我对 AWS 还很陌生,但遇到了一些问题。这是我的代码:

from __future__ import print_function
from urllib2 import Request, urlopen, URLError
import requests
import boto3
import json

def lambda_handler(event, context):
    url = "https://globalcurrencies.xignite.com/xGlobalCurrencies.json/GetHistoricalRatesRange?Symbol=BTCUSD&PriceType=Mid&StartDate=01/01/2017&EndDate=10/27/2017&PeriodType=Daily&FixingTime=22:00&_token=some_token_xyz"
    response = requests.get(url).json()
    # print json.dumps(response, indent=4) # gives a syntax error
    return response

文件名是 lambda_function.py;我在 stackoverflow 上检查过类似的问题,有些人提到我必须更改文件命名。但这没有帮助。以下是 Python 方法的命名方式:
这是我得到的错误: START RequestId: cf24e9be-bbef-11e7-97b4-d9b586307f3e Version: $LATEST Unable to import module 'lambda_function': No module named requests 当尝试打印时,它会给我一个语法错误。抱歉格式化。有什么建议吗?

【问题讨论】:

  • requests 不在标准库中。您需要研究如何在该平台上提供依赖项;例如,通常使用requirements.txt 文件来指定它们。看看例如docs.aws.amazon.com/lambda/latest/dg/…
  • @jonrsharpe 我在我的机器上设置了虚拟环境。我应该把所有东西都上传到pip install -r requirements.txt 吗?

标签: python-2.7 amazon-web-services aws-lambda


【解决方案1】:

你必须在 python 代码中这样命名你的 lambda:

def lambda_function(event, context):

在 lambda 控制台处理程序中:

main.lambda_function

对于您的请求错误,在您上传到 lambda 之前,您的 .zip 中必须包含该模块的文件夹。

【讨论】:

  • 不,还有一个错误:Unable to import module 'main': No module named requests
  • 你有里面有请求库的 .zip 文件夹吗?在上传到 lambda 之前?这就是问题
【解决方案2】:

这是因为它在 lambda 中运行时缺少 requests 库 - 它可能已全局安装在您的本地计算机上。如果你运行:
pip install requests -t .
在与您的源代码相同的目录中,它将在该目录中安装请求包,然后您可以将其与您的 lambda_function.py 一起上传到 lambda。您可能需要对 boto3 和 json 执行相同的操作:
pip install boto3 -t .
pip install json -t .

【讨论】:

【解决方案3】:

“requests”模块不在您尝试安装的“zip”文件中。您必须通过 'pip install module_name(such as requests) -t ' 将所有模块放入 zip 文件中。

【讨论】:

    【解决方案4】:

    requests 不是 AWS lambda 中的标准库。

    所以有两种方法可以解决这个问题:

    1- 从 Botocore 库堆栈中​​将其导入为:(给出答案后不推荐使用的选项)

    from botocore.vendored import requests
    

    Here 有一个所有可用库的列表,可以在 lambda 中导入

    2- Create 带有 virtualenv 的部署包。

    【讨论】:

    • 选项号 1 喊出此消息:/var/runtime/botocore/vendored/requests/api.py:67: DeprecationWarning: You are using the get() function from 'botocore.vendored.requests' .这不是 botocore 中的公共 API,将来会被删除。此外,此版本的请求已过时。我们建议您安装 requests 包,直接“导入请求”,并改用 requests.get() 函数。
    • 我刚刚添加了提示。感谢@ilvidel 的提醒!
    • 根据更新版本的警告:“此依赖项已从 Botocore 中删除,并将在 2020 年 3 月 31 日之后从 Lambda 中删除。”坚持选项 2。
    【解决方案5】:

    您想使用Layers。您下载一个 python 模块,例如 pip install requests -t . 然后简单地将所有模块文件夹放入一个名为 python 的文件夹中,然后将其压缩并上传到 aws 控制台的 lambda 层部分。将它添加到您的 lambda 函数中,它将起作用。 dir 结构非常重要,因此对于解压缩文件夹时的请求,它应该是 RequestLayer/python/requests/"requests 以及属于该包的所有其他文件夹"。 This guy gives a good step by step.

    【讨论】:

    • 文件夹结构应该是什么? “RequestLayer”是什么意思?我尝试了您的版本和其他一些版本(有或没有“RequesLayer”,有或没有“请求”),但没有运气。
    • @LoMaPh 我在没有 RequestLayer 的情况下尝试过,它可以工作。因此,在使用 pip 安装包后,将所有内容放在一个名为 python 的文件夹中,压缩并将其添加为层。
    【解决方案6】:

    对于使用 Python 的未来读者:如果您直接在 Cloud9 中创建了 Lambda 应用程序,您会注意到您的应用程序有一个虚拟环境。要安装请求(或任何其他软件包),请执行以下操作:

    1. 右键单击您的应用的文件夹
    2. 选择“在此处打开终端”
    3. 在终端输入source venv/bin/activate 以激活您的虚拟环境
    4. 输入 pip3 install requests 以安装请求

    就是这样。您现在可以照常使用带有import requests 的请求。

    【讨论】:

    • 我没有看到“在此处打开终端”这样的选项
    【解决方案7】:

    如果要包含不属于 Python 标准库的库,例如 requests,可以使用 lambda's layers


    1.创建压缩包

    这是一个 zip,其中包含您希望 lambda 函数使用的所有库。 首先,创建一个名为python的文件夹:

    $ mkdir python
    $ cd python
    

    然后,在其中安装您需要的 Python 库。您可以使用单个库来执行此操作:

    $ pip install --target . requests
    

    或带有库列表(requirements.txt)

    $ pip install --target . -r requirements.txt
    

    最后,把所有东西都拉上拉链。

    ...在 Bash 中:

    $ zip -r dependencies.zip ../python
    

    ...在 Powershell 中:

    $ Compress-Archive -Path . -DestinationPath dependencies.zip
    

    2。创建图层

    您可以在 AWS 控制台或 CLI 中执行此操作。关注these instructions


    3.将图层添加到 lambda 函数中

    您可以使用 lambda 页面或 CLI 中的 Add a layer 选项来执行此操作。关注these instructions

    【讨论】:

    • 很好的答案!就我而言,第 2 步引发了错误 ERROR: Can not combine '--user' and '--target'。事实证明,如果 Python 作为应用程序从商店安装,或者在其他一些情况下,就会发生这种情况。通过在命令末尾添加--no-user 可以轻松解决此问题:pip install --target . requests --no-userSource
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多