在Mac上安装numpy以在AWS Lambda上使用

6
有没有一种方法可以在Mac上安装numpy,以便上传到AWS Lambda时可以正常工作?我尝试了各种不同的方法,包括使用不同的pip版本,使用easy_install,并遵循此帖子,但似乎都无法正常工作。我还尝试克隆git存储库并从那里构建,但我也无法让它正常工作(尽管我不确定在那之后是否复制了正确的文件)。
我得到的错误是:
无法导入模块“lambda_function”:导入多维数组numpy扩展模块失败。最可能的是您正在尝试导入numpy的失败构建。如果您正在使用numpy git repo,请尝试git clean -xdf(删除所有未受版本控制的文件)。否则重新安装numpy。
this post的启发,我能够在Linux环境中使用pip install numpy并使其在Lambda上运行。因此我的问题是:是否可能在Mac上安装numpy以便它在AWS Lambda上工作?环境:MacBook Pro,MacOS 10.12.2,默认python版本为2.7.10。我一直在使用hello-world-python示例在Lambda上进行了轻微变化的测试。
from __future__ import print_function
import numpy

def lambda_handler(event, context):
    #print("Received event: " + json.dumps(event, indent=2))
    print("value1 = " + event['key1'])

(更新) 进一步提出问题: 为什么有些软件包可以运行而其他软件包不能运行?


1
你必须使用专为亚马逊Linux构建的版本。你不能在Lambda部署中打包Mac二进制文件。 - Mark B
谢谢 @MarkB。你知道为什么numpy会出现这种情况,而其他包却没有吗?到目前为止,我只在使用numpy时遇到了这个问题。换句话说,有没有办法提前知道哪些包需要进行Linux构建呢? - Tchotchke
你可以从Python项目下载文件中解压numpy whl文件,这里有一个更详细的答案:https://dev59.com/tlcP5IYBdhLWcg3ww8qS#52665589 - chim
@Tchotchke 可能是因为numpy是你使用过的唯一一个包,其中有一些部分是用C编写的。其他的可能都是纯Python编写的,通常是跨平台的。而C需要编译成特定于平台的二进制文件。 - falsePockets
4个回答

7

更新:现在首选的方法是只使用AWS提供的NumPy/SciPy Lambda Layer,这非常容易实现。

在控制台中,选择您的函数,然后在“设计”部分下单击“层”。然后单击“添加层”,并在AWS提供的下拉菜单中选择“AWSLambda-Python37-SciPy1x”(或者您正在使用的Python版本的相应内容)。

然后,您就可以无缝地将numpy、scipy等导入到代码中,没有任何问题。

2020年10月26日 - 添加示例截图: 输入图片描述

输入图片描述


将屏幕截图添加到您的答案中,人们也可以查看此链接:https://towardsdatascience.com/introduction-to-amazon-lambda-layers-and-boto3-using-python3-39bd390add17 - NealWalters

1

更新:请忽略下面的内容,查看我上面的回复(这里:在Mac上安装numpy以在AWS Lambda上使用),关于使用Lambda Layers的方法要简单得多。

===========================================================================

我曾经遇到过完全相同的问题,通过按照这里的建议轻松解决了:

https://serverless.com/blog/serverless-python-packaging/

请注意,我还必须添加以下行:

package:
  exclude:
    - venv/**

我需要在serverless.yml文件末尾添加一些内容,以使我的zip文件大小符合限制。

为了防止链接失效,我将重新复制博客文章中的说明。


==============================================

创建一个使用numpy的Lambda函数

  1. 安装node/npm
  2. npm install -g serverless
  3. 为您的计算机配置aws(安装cli,运行“aws configure”并添加从IAM生成的凭据)。 3a. 安装Mac版Docker

  4. 4.

运行以下命令:

serverless create \
  --template aws-python3 \
  --name numpy-test \
  --path numpy-test

cd numpy-test
virtualenv venv --python=python3
source venv/bin/activate

将handler.py文件的内容替换为以下内容:

handler.py

import numpy as np
def main(event, context):
    a = np.arange(15).reshape(3, 5)
    print("Your numpy array:")
    print(a)


if __name__ == "__main__":
    main('', '')

运行以下代码:
pip3 install numpy
pip3 freeze > requirements.txt
cat requirements.txt

将serverless.yml替换为以下内容:

serverless.yml

service: numpy-test

provider:
  name: aws
  runtime: python3.6

functions:
  numpy:
    handler: handler.main
  1. 运行以下代码

运行:

npm init

接受默认值,然后输入“是”。
npm install --save serverless-python-requirements

现在请将 serverless.yml 替换为以下内容:

serverless.yml

service: numpy-test

provider:
  name: aws
  runtime: python3.6

functions:
  numpy:
    handler: handler.main

plugins:
  - serverless-python-requirements

custom:
  pythonRequirements:
    dockerizePip: non-linux

package:
  exclude:
    - venv/**
  1. Run the following

Run

serverless deploy --aws-profile [aws-account-you-want-to-upload-fxn-to]
serverless invoke -f numpy --log

如果一切顺利,您应该会看到类似于这样的东西:

预期输出:

START RequestId: b32af7a8-52fb-4145-9e85-5985a0f64fe4 Version: $LATEST
Your numpy array:
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]
END RequestId: b32af7a8-52fb-4145-9e85-5985a0f64fe4
REPORT RequestId: b32af7a8-52fb-4145-9e85-5985a0f64fe4  Duration: 0.52 ms    
Billed Duration: 100 ms     Memory Size: 1024 MB    Max Memory Used: 37 MB

0

在 @MarkB 的评论基础上,无法在 Mac 上构建 numpy 以在 AWS Lambda 上使用。那么为什么有些软件包可以工作而其他软件包不行呢?

正如 Mark Nunnikhoven 在 这里 解释的那样,Python 扩展模块是

用 C 或 C++ 编写的,可以扩展 Python 或调用 C 或 C++ 库。

由于这些模块是针对特定系统编译的,而 AWS Lambda 是一个 Linux 环境,因此您需要在 Linux 环境中安装任何扩展模块。


0

如果要使用AWS层中没有的其他软件包,请按照以下步骤操作:

  1. 打开终端
  2. 创建一个名为“python”的目录。
  3. 进入该目录。
  4. 输入“pip install”命令。
  5. 将此文件压缩并添加到AWS中。

请访问以下链接获取更多详细信息:https://www.youtube.com/watch?v=3BH79Uciw5w


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接