简体   繁体   English

在亚马逊 lambda 中使用 moviepy、scipy 和 numpy

[英]Using moviepy, scipy and numpy in amazon lambda

I'd like to generate video using AWS Lambda feature.我想使用AWS Lambda功能生成视频。

I've followed instructions found here and here .我已按照此处此处的说明进行操作。

And I now have the following process to build my Lambda function:我现在有以下过程来构建我的Lambda function:

Step 1第1步

Fire a Amazon Linux EC2 instance and run this as root on it:启动一个Amazon Linux EC2实例并以 root 身份运行它:

#! /usr/bin/env bash

# Install the SciPy stack on Amazon Linux and prepare it for AWS Lambda

yum -y update
yum -y groupinstall "Development Tools"
yum -y install blas --enablerepo=epel
yum -y install lapack --enablerepo=epel
yum -y install atlas-sse3-devel --enablerepo=epel
yum -y install Cython --enablerepo=epel
yum -y install python27
yum -y install python27-numpy.x86_64
yum -y install python27-numpy-f2py.x86_64
yum -y install python27-scipy.x86_64

/usr/local/bin/pip install --upgrade pip
mkdir -p /home/ec2-user/stack
/usr/local/bin/pip install moviepy -t /home/ec2-user/stack

cp -R /usr/lib64/python2.7/dist-packages/numpy /home/ec2-user/stack/numpy
cp -R /usr/lib64/python2.7/dist-packages/scipy /home/ec2-user/stack/scipy

tar -czvf stack.tgz /home/ec2-user/stack/*

Step 2第2步

I scp the resulting tarball to my laptop.我将生成的 tarball scp 到我的笔记本电脑。 And then run this script to build a zip archive.然后运行此脚本以构建 zip 存档。

#! /usr/bin/env bash

mkdir tmp
rm lambda.zip
tar -xzf stack.tgz -C tmp

zip -9 lambda.zip process_movie.py
zip -r9 lambda.zip *.ttf
cd tmp/home/ec2-user/stack/
zip -r9 ../../../../lambda.zip *

process_movie.py script is at the moment only a test to see if the stack is ok: process_movie.py脚本目前只是一个测试,看看堆栈是否正常:

def make_movie(event, context):
    import os
    print(os.listdir('.'))
    print(os.listdir('numpy'))
    try:
        import scipy
    except ImportError:
        print('can not import scipy')

    try:
        import numpy
    except ImportError:
        print('can not import numpy')

    try:
        import moviepy
    except ImportError:
        print('can not import moviepy')

Step 3步骤 3

Then I upload the resulting archive to S3 to be the source of my lambda function. When I test the function I get the following callstack :然后我将生成的存档上传到 S3 作为我的lambda function 的来源。当我测试 function 时,我得到以下callstack

START RequestId: 36c62b93-b94f-11e5-9da7-83f24fc4b7ca Version: $LATEST
['tqdm', 'imageio-1.4.egg-info', 'decorator.pyc', 'process_movie.py', 'decorator-4.0.6.dist-info', 'imageio', 'moviepy', 'tqdm-3.4.0.dist-info', 'scipy', 'numpy', 'OpenSans-Regular.ttf', 'decorator.py', 'moviepy-0.2.2.11.egg-info']
['add_newdocs.pyo', 'numarray', '__init__.py', '__config__.pyc', '_import_tools.py', 'setup.pyo', '_import_tools.pyc', 'doc', 'setupscons.py', '__init__.pyc', 'setup.py', 'version.py', 'add_newdocs.py', 'random', 'dual.pyo', 'version.pyo', 'ctypeslib.pyc', 'version.pyc', 'testing', 'dual.pyc', 'polynomial', '__config__.pyo', 'f2py', 'core', 'linalg', 'distutils', 'matlib.pyo', 'tests', 'matlib.pyc', 'setupscons.pyc', 'setup.pyc', 'ctypeslib.py', 'numpy', '__config__.py', 'matrixlib', 'dual.py', 'lib', 'ma', '_import_tools.pyo', 'ctypeslib.pyo', 'add_newdocs.pyc', 'fft', 'matlib.py', 'setupscons.pyo', '__init__.pyo', 'oldnumeric', 'compat']
can not import scipy
'module' object has no attribute 'core': AttributeError
Traceback (most recent call last):
  File "/var/task/process_movie.py", line 91, in make_movie
    import numpy
  File "/var/task/numpy/__init__.py", line 122, in <module>
    from numpy.__config__ import show as show_config
  File "/var/task/numpy/numpy/__init__.py", line 137, in <module>
    import add_newdocs
  File "/var/task/numpy/numpy/add_newdocs.py", line 9, in <module>
    from numpy.lib import add_newdoc
  File "/var/task/numpy/lib/__init__.py", line 13, in <module>
    from polynomial import *
  File "/var/task/numpy/lib/polynomial.py", line 11, in <module>
    import numpy.core.numeric as NX
AttributeError: 'module' object has no attribute 'core'

END RequestId: 36c62b93-b94f-11e5-9da7-83f24fc4b7ca
REPORT RequestId: 36c62b93-b94f-11e5-9da7-83f24fc4b7ca  Duration: 112.49 ms Billed Duration: 200 ms     Memory Size: 1536 MB    Max Memory Used: 14 MB

I cant understand why python does not found the core directory that is present in the folder structure.我不明白为什么 python 找不到文件夹结构中存在的核心目录。

EDIT:编辑:

Following @jarmod advice I've reduced the lambda function to:按照@jarmod 的建议,我将lambda function 减少为:

def make_movie(event, context):
    print('running make movie')
    import numpy

I now have the following error:我现在有以下错误:

START RequestId: 6abd7ef6-b9de-11e5-8aee-918ac0a06113 Version: $LATEST
running make movie
Error importing numpy: you should not try to import numpy from
        its source directory; please exit the numpy source tree, and relaunch
        your python intepreter from there.: ImportError
Traceback (most recent call last):
  File "/var/task/process_movie.py", line 3, in make_movie
    import numpy
  File "/var/task/numpy/__init__.py", line 127, in <module>
    raise ImportError(msg)
ImportError: Error importing numpy: you should not try to import numpy from
        its source directory; please exit the numpy source tree, and relaunch
        your python intepreter from there.

END RequestId: 6abd7ef6-b9de-11e5-8aee-918ac0a06113
REPORT RequestId: 6abd7ef6-b9de-11e5-8aee-918ac0a06113  Duration: 105.95 ms Billed Duration: 200 ms     Memory Size: 1536 MB    Max Memory Used: 14 MB

I was also following your first link and managed to import numpy and pandas in a Lambda function this way (on Windows): 我也在关注你的第一个链接并设法以这种方式在Lambda函数中导入numpypandas (在Windows上):

  1. Started a (free-tier) t2.micro EC2 instance with 64-bit Amazon Linux AMI 2015.09.1 and used Putty to SSH in. 使用64位Amazon Linux AMI 2015.09.1启动(免费层) t2.micro EC2实例 ,并使用Putty进入SSH。
  2. Tried the same commands you used and the one recommended by the Amazon article: 尝试使用您使用的相同命令和亚马逊文章推荐的命令

     sudo yum -y update sudo yum -y upgrade sudo yum -y groupinstall "Development Tools" sudo yum -y install blas --enablerepo=epel sudo yum -y install lapack --enablerepo=epel sudo yum -y install Cython --enablerepo=epel sudo yum install python27-devel python27-pip gcc 
  3. Created the virtual environment : 创建虚拟环境

     virtualenv ~/env source ~/env/bin/activate 
  4. Installed the packages : 安装

     sudo ~/env/bin/pip2.7 install numpy sudo ~/env/bin/pip2.7 install pandas 
  5. Then, using WinSCP, I logged in and downloaded everything (except _markerlib, pip*, pkg_resources, setuptools* and easyinstall*) from /home/ec2-user/env/lib/python2.7/dist-packages , and everything from /home/ec2-user/env/lib64/python2.7/site-packages from the EC2 instance. 然后,使用WinSCP,我从/home/ec2-user/env/lib/python2.7/dist-packages登录并下载了所有内容(除了_markerlib,pip *,pkg_resources,setuptools *和easyinstall *),以及来自/home/ec2-user/env/lib64/python2.7/site-packages所有内容来自EC2实例的/home/ec2-user/env/lib64/python2.7/site-packages

  6. I put all these folders and files into one zip , along with the .py file containing the Lambda function. 我将所有这些文件夹和文件放在一个zip中 ,以及包含Lambda函数的.py文件。 illustration of all files copied 复制的所有文件的插图

  7. Because this .zip is larger than 10 MB, I created an S3 bucket to store the file. 因为这个.zip大于10 MB,所以我创建了一个S3存储桶来存储文件。 I copied the link of the file from there and pasted at "Upload a .ZIP from Amazon S3" at the Lambda function. 我从那里复制了文件的链接并粘贴在Lambda函数的“从Amazon S3上传一个.ZIP”。

  8. The EC2 instance can be shut down , it's not needed any more. 可以关闭 EC2实例,不再需要它。

With this, I could import numpy and pandas. 有了这个,我可以导入numpy和pandas。 I'm not familiar with moviepy, but scipy might already be tricky as Lambda has a limit for unzipped deployment package size at 262 144 000 bytes. 我不熟悉moviepy,但scipy可能已经很棘手,因为Lambda对解压缩的部署包大小限制为262 144 000字节。 I'm afraid numpy and scipy together are already over that. 我害怕numpy和scipy已经结束了。

With the help of all posts in this thread here is a solution for the records: 在这个帖子的所有帖子的帮助下,这里是记录的解决方案:

To get this to work you'll need to: 要实现这一点,您需要:

  1. start a EC2 instance with at least 2GO RAM (to be able to compile NumPy & SciPy ) 使用至少2GO RAM启动EC2实例(以便能够编译NumPySciPy

  2. Install the needed dependencies 安装所需的依赖项

     sudo yum -y update sudo yum -y upgrade sudo yum -y groupinstall "Development Tools" sudo yum -y install blas --enablerepo=epel sudo yum -y install lapack --enablerepo=epel sudo yum -y install Cython --enablerepo=epel sudo yum install python27-devel python27-pip gcc virtualenv ~/env source ~/env/bin/activate pip install scipy pip install numpy pip install moviepy 
  3. Copy to your locale machine all the content of the directories (except _markerlib, pip*, pkg_resources, setuptools* and easyinstall*) in a stack folder: 复制到您的语言环境的机器目录的所有内容(除_markerlib,PIP *,通过pkg_resources,setuptools的*和* easyinstall)在stack的文件夹:

    • home/ec2-user/env/lib/python2.7/dist-packages
    • home/ec2-user/env/lib64/python2.7/dist-packages
  4. get all required shared libraries from you EC2 instance: 从您的EC2实例获取所有必需的共享库:

    • libatlas.so.3
    • libf77blas.so.3
    • liblapack.so.3
    • libptf77blas.so.3
    • libcblas.so.3
    • libgfortran.so.3
    • libptcblas.so.3
    • libquadmath.so.0
  5. Put them in a lib subfolder of the stack folder 将它们放在stack文件夹的lib子文件夹中

  6. imageio is a dependency of moviepy , you'll need to download some binary version of its dependencies: libfreeimage and of ffmpeg ; imageioimageio的依赖moviepy ,你需要下载它的依赖项的一些二进制版本: libfreeimageffmpeg ; they can be found here . 他们可以在这里找到。 Put them at the root of your stack folder and rename libfreeimage-3.16.0-linux64.so to libfreeimage.so 将它们放在堆栈文件夹的根目录下,并将libfreeimage-3.16.0-linux64.so重命名为libfreeimage.so

  7. You should now have a stack folder containing: 您现在应该有一个stack文件夹包含:

    • all python dependencies at root root的所有python依赖项
    • all shared libraries in a lib subfolder lib子文件夹中的所有共享库
    • ffmpeg binary at root 根目录下的ffmpeg二进制文件
    • libfreeimage.so at root libfreeimage.so在root
  8. Zip this folder: zip -r9 stack.zip . -x ".*" -x "*/.*" 压缩此文件夹: zip -r9 stack.zip . -x ".*" -x "*/.*" zip -r9 stack.zip . -x ".*" -x "*/.*"

  9. Use the following lambda_function.py as an entry point for your lambda 使用以下lambda_function.py作为lambda的入口点

     from __future__ import print_function import os import subprocess SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) LIB_DIR = os.path.join(SCRIPT_DIR, 'lib') FFMPEG_BINARY = os.path.join(SCRIPT_DIR, 'ffmpeg') def lambda_handler(event, context): command = 'LD_LIBRARY_PATH={} IMAGEIO_FFMPEG_EXE={} python movie_maker.py'.format( LIB_DIR, FFMPEG_BINARY, ) try: output = subprocess.check_output(command, shell=True) print(output) except subprocess.CalledProcessError as e: print(e.output) 
  10. write a movie_maker.py script that depends on moviepy , numpy , ... 写一个movie_maker.py脚本,它依赖于moviepynumpy ,...

  11. add those to script to your stack.zip file zip -r9 lambda.zip *.py 将那些脚本添加到你的stack.zip文件zip -r9 lambda.zip *.py

  12. upload the zip to S3 and use it as a source for your lambda 将zip上传到S3并将其用作lambda的源

You can also download the stack.zip here . 你也可以在这里下载stack.zip

The posts here help me to find a way to statically compile NumPy with libraries files that can be included in the AWS Lambda Deployment package. 这里的帖子帮助我找到一种方法来静态编译NumPy,其中包含可以包含在AWS Lambda Deployment包中的库文件。 This solution does not depend on LD_LIBRARY_PATH value as in @rouk1 solution. 此解决方案不依赖于@ rouk1解决方案中的LD_LIBRARY_PATH值。

The compiled NumPy library can be downloaded from https://github.com/vitolimandibhrata/aws-lambda-numpy 编译的NumPy库可以从https://github.com/vitolimandibhrata/aws-lambda-numpy下载

Here are the steps to custom compile NumPy 以下是自定义编译NumPy的步骤

Instructions on compiling this package from scratch 从头开始编译此包的说明

Prepare a fresh AWS EC instance with AWS Linux. 使用AWS Linux准备新的AWS EC实例。

Install compiler dependencies 安装编译器依赖项

sudo yum -y install python-devel
sudo yum -y install gcc-c++
sudo yum -y install gcc-gfortran
sudo yum -y install libgfortran

Install NumPy dependencies 安装NumPy依赖项

sudo yum -y install blas
sudo yum -y install lapack
sudo yum -y install atlas-sse3-devel

Create /var/task/lib to contain the runtime libraries 创建/ var / task / lib以包含运行时库

mkdir -p /var/task/lib

/var/task is the root directory where your code will reside in AWS Lambda thus we need to statically link the required library files in a well known folder which in this case /var/task/lib / var / task是您的代码将驻留在AWS Lambda中的根目录,因此我们需要在一个众所周知的文件夹中静态链接所需的库文件,在本例中为/ var / task / lib

Copy the following library files to the /var/task/lib 将以下库文件复制到/ var / task / lib

cp /usr/lib64/atlas-sse3/liblapack.so.3 /var/task/lib/.
cp /usr/lib64/atlas-sse3/libptf77blas.so.3 /var/task/lib/.
cp /usr/lib64/atlas-sse3/libf77blas.so.3 /var/task/lib/.
cp /usr/lib64/atlas-sse3/libptcblas.so.3 /var/task/lib/.
cp /usr/lib64/atlas-sse3/libcblas.so.3 /var/task/lib/.
cp /usr/lib64/atlas-sse3/libatlas.so.3 /var/task/lib/.
cp /usr/lib64/atlas-sse3/libptf77blas.so.3 /var/task/lib/.
cp /usr/lib64/libgfortran.so.3 /var/task/lib/.
cp /usr/lib64/libquadmath.so.0 /var/task/lib/.

Get the latest numpy source code from http://sourceforge.net/projects/numpy/files/NumPy/ http://sourceforge.net/projects/numpy/files/NumPy/获取最新的numpy源代码

Go to the numpy source code folder eg numpy-1.10.4 Create a site.cfg file with the following entries 转到numpy源代码文件夹,例如numpy-1.10.4使用以下条目创建site.cfg文件

[atlas]
libraries=lapack,f77blas,cblas,atlas
search_static_first=true
runtime_library_dirs = /var/task/lib
extra_link_args = -lgfortran -lquadmath

-lgfortran -lquadmath flags are required to statically link gfortran and quadmath libraries with files defined in runtime_library_dirs -lgfortran -lquadmath标志是将gfortran和quadmath库与runtime_library_dirs中定义的文件静态链接所必需的

Build NumPy 建立NumPy

python setup.py build

Install NumPy 安装NumPy

python setup.py install

Check whether the libraries are linked to the files in /var/task/lib 检查库是否链接到/ var / task / lib中的文件

ldd $PYTHON_HOME/lib64/python2.7/site-packages/numpy/linalg/lapack_lite.so

You should see 你应该看到

linux-vdso.so.1 =>  (0x00007ffe0dd2d000)
liblapack.so.3 => /var/task/lib/liblapack.so.3 (0x00007ffad6be5000)
libptf77blas.so.3 => /var/task/lib/libptf77blas.so.3 (0x00007ffad69c7000)
libptcblas.so.3 => /var/task/lib/libptcblas.so.3 (0x00007ffad67a7000)
libatlas.so.3 => /var/task/lib/libatlas.so.3 (0x00007ffad6174000)
libf77blas.so.3 => /var/task/lib/libf77blas.so.3 (0x00007ffad5f56000)
libcblas.so.3 => /var/task/lib/libcblas.so.3 (0x00007ffad5d36000)
libpython2.7.so.1.0 => /usr/lib64/libpython2.7.so.1.0 (0x00007ffad596d000)
libgfortran.so.3 => /var/task/lib/libgfortran.so.3 (0x00007ffad5654000)
libm.so.6 => /lib64/libm.so.6 (0x00007ffad5352000)
libquadmath.so.0 => /var/task/lib/libquadmath.so.0 (0x00007ffad5117000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007ffad4f00000)
libc.so.6 => /lib64/libc.so.6 (0x00007ffad4b3e000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ffad4922000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007ffad471d000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007ffad451a000)
/lib64/ld-linux-x86-64.so.2 (0x000055cfc3ab8000)

As of 2017, NumPy and SciPy have wheels that work on Lambda (the packages include precompiled libgfortran and libopenblas ). 截至2017年,NumPy和SciPy拥有适用于Lambda的轮子(这些软件包包括预编译的libgfortranlibopenblas )。 As far as I know, MoviePy is a pure Python module, so basically you could do: 据我所知,MoviePy是一个纯Python模块,所以基本上你可以这样做:

pip2 install -t lambda moviepy scipy

Then copy your handler into the lambda directory and zip it. 然后将处理程序复制到lambda目录并压缩它。 Except, that you'll most likely exceed the 50/250 MB size limits. 除此之外,您最有可能超过50/250 MB的大小限制。 There are a couple of things that can help: 有几件事可以帮助:

  • remove .pycs, docs, tests and other unnecessary parts; 删除.pycs,docs,tests和其他不必要的部分;
  • leave a single copy of common libraries of NumPy and SciPy; 留下NumPy和SciPy公共图书馆的单一副本;
  • strip libraries of inessential pieces, such as debugging symbols; 剥离不必要的部分库,例如调试符号;
  • compress the archive using higher settings. 使用更高的设置压缩存档。

Here's an example script that automates the above points. 这是一个自动执行上述要点的示例脚本

Another, very simple method that's possible these days is to build using the awesome docker containers that LambCI made to mimic Lambda: https://github.com/lambci/docker-lambda 另一种非常简单的方法是使用LambCI用于模仿Lambda的令人敬畏的docker容器来构建: https//github.com/lambci/docker-lambda

The lambci/lambda:build container resembles AWS Lambda with the addition of a mostly-complete build environment. lambci/lambda:build容器类似于AWS Lambda,增加了一个大部分完整的构建环境。 To start a shell session in it: 要在其中启动shell会话:

docker run -v "$PWD":/var/task -it lambci/lambda:build bash

Inside the session: 会议内部:

export share=/var/task
easy_install pip
pip install -t $share numpy

Or, with virtualenv: 或者,使用virtualenv:

export share=/var/task
export PS1="[\u@\h:\w]\$ " # required by virtualenv
easy_install pip
pip install virtualenv
# ... make the venv, install numpy, and copy it to $share

Later on you can use the main lambci/lambda container to test your build. 稍后您可以使用主lambci / lambda容器来测试您的构建。

As of 2018, Steps to install external modules in Python3 on AWS EC2: 截至2018年,在AWS EC2上的Python3中安装外部模块的步骤:

  1. Launch EC2 on Amazon Linux AMI 201709. 在Amazon Linux AMI 201709上启动EC2。

  2. ssh with putty using private and public key and become super user. 使用私钥和公钥使用putty进行ssh并成为超级用户。

  3. Install Python 3 and create virtual env, then make it default 安装Python 3并创建虚拟环境,然后将其设为默认值

     yum install python36 python36-virtualenv python36-pip virtualenv -p python3.6 /tmp/my_python_lib source /tmp/my_python_lib/bin/activate which python --to check which version s installed pip3 install numpy 
  4. Copy files under site packages and dist packages into your local machhine using winscp. 使用winscp将站点包和dist包下的文件复制到本地machhine中。

    To find actual location use grep commands --- 要查找实际位置,请使用grep命令---

      grep -r dist-packages *. 

These packages could be inside both lib and lib64. 这些包可以在lib和lib64中。

  1. Site and dist packages will be under location: Site和dist包将在以下位置:

     /tmp/my_python_lib/lib64/python3.6, /tmp/my_python_lib/lib/python3.6 
  2. Zip these packages along with your script file and upload to S3 which can be accessed in lambda.Instead of zipping the root folder you have to select all files and zip it or send to compressed folder. 将这些包与您的脚本文件一起压缩并上传到S3,可以在lambda中访问。而不是压缩根文件夹,您必须选择所有文件并压缩或发送到压缩文件夹。

Additional tips: 其他提示:

  1. If you want to install all packages under one directory, you can use command: 如果要在一个目录下安装所有软件包,可以使用命令:

      pip install --upgrade --target=/tmp/my_python_lib/lib/python3.6/dist-packages pandas 

As of August 2018, probably the easiest way is to start a new AWS Cloud9 environment . 截至2018年8月,最简单的方法可能是启动新的AWS Cloud9环境 Then create a Lambda function inside the environment. 然后在环境中创建一个Lambda函数。 Next run this into the Cloud9 command line: 接下来将其运行到Cloud9命令行:

    cd YourApplicationName
    /venv/bin/pip install scipy -t .
    /venv/bin/pip install numpy -t .
    /venv/bin/pip install moviepy -t .

Now I am able to import the modules in the lambda_handler function. 现在我可以在lambda_handler函数中导入模块了。

Nov 2018 . 2018年11月 Hi friends, this post is extremely helpful for me. 嗨朋友们,这篇文章对我非常有帮助。 However, the answers so far are not very automated. 但是,到目前为止答案并不是很自动化。 I wrote a Python script and tutorial here https://gist.github.com/steinwaywhw/6a6a25d594cc07146c60af943f74c16f to automate the creation of compiled Python packages using pip and virtualenv on EC2. 我在这里编写了一个Python脚本和教程https://gist.github.com/steinwaywhw/6a6a25d594cc07146c60af943f74c16f,以便在EC2上使用pipvirtualenv自动创建编译的Python包。 Everything is Python (Boto3), no bash script, no Web console, no awscli . 一切都是Python(Boto3),没有bash脚本,没有Web控制台,没有awscli

There are one other change besides automation, which I think is an improvement. 除了自动化之外还有另外一个变化,我认为这是一种改进。 I downloaded the whole Python virtual environment from EC2 preserving its folder structures, instead of merging lib and lib64 packages all together. 我从EC2下载了整个Python虚拟环境,保留了它的文件夹结构,而不是将liblib64包合并在一起。 I never understand the intended meaning of merging those two folders. 我永远不会理解合并这两个文件夹的意图。 What if some packages override other packages, right? 如果某些包覆盖其他包,该怎么办? Plus, faking an official virtual environment is non-the-less a safer way to go than rolling your own. 伪装成官方虚拟环境绝对不是一种更安全的方式,而不是滚动自己的方式。

For the downloaded virtual environment to work, the source code of the Lambda function adds some boilerplate code to update Python search path using sys.path . 为了使下载的虚拟环境起作用,Lambda函数的源代码添加了一些样板代码,以使用sys.path更新Python搜索路径。 The intended sys.path of a Python virtual environment can be found by 可以通过以下方式找到Python虚拟环境的预期sys.path

  • On your own machine, create a virtual environment and activate it. 在您自己的计算机上,创建虚拟环境并将其激活。
  • Run a Python script in this virtual environment and do print(sys.path) after import sys . 在此虚拟环境中运行Python脚本,并在import sys后执行print(sys.path) You can start from there and modify as you see fit. 您可以从那里开始并根据需要进行修改。

A snippet of the boilerplate code to add for a Lambda function in order to load numpy and other packages from my packaged virtual environment is pasted below. 下面粘贴了一个样板代码片段,用于为Lambda函数添加以便从我的打包虚拟环境中加载numpy和其他包。 In my case, I loaded pandas_datareader which relies on numpy . 就我而言,我加载了pandas_datareader ,它依赖于numpy

import os
import sys 

# https://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html
workdir = os.getenv('LAMBDA_TASK_ROOT')
version = f'{sys.version_info[0]}.{sys.version_info[1]}'
additionals = [f'{workdir}/venv/lib64/python{version}/site-packages',
               f'{workdir}/venv/lib64/python{version}/lib-dynload',
               f'{workdir}/venv/lib64/python{version}/dist-packages',
               f'{workdir}/venv/lib/python{version}/dist-packages',
               f'{workdir}/venv/lib/python{version}/site-packages']
sys.path = additionals + sys.path

import pandas_datareader as pdr

I can confirm that the steps posted by @attila-tanyi work correctly under Amazon Linux. 我可以确认@ attila-tanyi发布的步骤在Amazon Linux下正常工作。 I would only add that there is no need to use an EC2, as there is an Amazon Linux docker container available from the default repository. 我只想补充说,不需要使用EC2,因为默认存储库中有一个Amazon Linux docker容器。

docker pull amazonlinux && docker run -it amazonlinux
# Follow @attila-tanyi steps
# Note - sudo is not necessary here

I use the Dockerfile embedded in my application to build and deploy to Lambda. 我使用嵌入在我的应用程序中的Dockerfile来构建和部署到Lambda。

I like @Vito Limandibhrata's answer but I think it's not enough to build numpy with runtime_library_dirs in numpy==1.11.1. 我喜欢@Vito Limandibhrata的答案,但我认为用numpy == 1.11.1中的runtime_library_dirs构建numpy是不够的。 If anybody think site-cfg is ignored, do the following: 如果有人认为site-cfg被忽略,请执行以下操作:

cp /usr/lib64/atlas-sse3/*.a /var/task/lib/

*.a files under atlas-sse3 are needed to build numpy. * .atlas-sse3下的.a文件需要构建numpy。 Also, you might need to run the following: 此外,您可能需要运行以下命令:

python setup.py config

to check numpy configuration. 检查numpy配置。 If it requires something more, you will see the following message: 如果需要更多内容,您将看到以下消息:

atlas_threads_info:
Setting PTATLAS=ATLAS   libraries ptf77blas,ptcblas,atlas not found in /root/Envs/skl/lib
    libraries lapack_atlas not found in /root/Envs/skl/lib
    libraries ptf77blas,ptcblas,atlas not found in /usr/local/lib64   
    libraries lapack_atlas not found in /usr/local/lib64
    libraries ptf77blas,ptcblas,atlas not found in /usr/local/lib         
    libraries lapack_atlas not found in /usr/local/lib
    libraries lapack_atlas not found in /usr/lib64/atlas-sse3
<class 'numpy.distutils.system_info.atlas_threads_info'>
Setting PTATLAS=ATLAS
Setting PTATLAS=ATLAS
Setting PTATLAS=ATLAS
Setting PTATLAS=ATLAS
    libraries lapack not found in ['/var/task/lib']
Runtime library lapack was not found. Ignoring
    libraries f77blas not found in ['/var/task/lib']
Runtime library f77blas was not found. Ignoring
    libraries cblas not found in ['/var/task/lib']
Runtime library cblas was not found. Ignoring
    libraries atlas not found in ['/var/task/lib']
Runtime library atlas was not found. Ignoring
    FOUND:
        extra_link_args = ['-lgfortran -lquadmath']
        define_macros = [('NO_ATLAS_INFO', -1)]
        language = f77
        libraries = ['lapack', 'ptf77blas', 'ptcblas', 'atlas', 'lapack', 'f77blas', 'cblas', 'atlas']
        library_dirs = ['/usr/lib64/atlas-sse3']
        include_dirs = ['/usr/include']

then site-cfg is going to be ignored. 那么site-cfg将被忽略。

Tip: If pip is used to build numpy with runtime_library_dirs, you would better create ~/.numpy-site.cfg and add the following: 提示:如果pip用于使用runtime_library_dirs构建numpy,则最好创建~/.numpy-site.cfg并添加以下内容:

[atlas]
libraries = lapack,f77blas,cblas,atlas
search_static_first = true
runtime_library_dirs = /var/task/lib
extra_link_args = -lgfortran -lquadmath

then numpy recognizes .numpy-site.cfg file. 然后numpy识别.numpy-site.cfg文件。 It's quite simple and easy way. 这是非常简单和容易的方式。

You can create zip file for lambda with scipy, numpy, moviepy and pandas on any OS.您可以在任何操作系统上使用 scipy、numpy、moviepy 和 pandas 为 lambda 创建 zip 文件。

https://pypi.org/project/scipy/#files https://pypi.org/project/scipy/#files

pypi has wheel files for different OS and you can download manylinux whl file and unzip. pypi 有适用于不同操作系统的 wheel 文件,你可以下载 manylinux whl 文件并解压。 After that remove dist-info and pyc files and zip all.之后删除 dist-info 和 pyc 文件以及 zip 全部。 The final zip file can be uploaded to S3 then and converted into lambda layer.最终的zip文件可以上传到S3然后转换成lambda层。

This tutorial is helpful to understand it deeply. 教程有助于深入理解它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM