为了账号安全,请及时绑定邮箱和手机立即绑定

在Amazon Lambda中使用moviepy,scipy和numpy

在Amazon Lambda中使用moviepy,scipy和numpy

德玛西亚99 2019-10-06 14:13:34
我想使用AWS Lambda功能生成视频。我已按照此处和此处的说明进行操作。现在,我具有以下过程来构建我的Lambda功能:第1步触发Amazon Linux EC2实例并以root身份运行它:#! /usr/bin/env bash# Install the SciPy stack on Amazon Linux and prepare it for AWS Lambdayum -y updateyum -y groupinstall "Development Tools"yum -y install blas --enablerepo=epelyum -y install lapack --enablerepo=epelyum -y install atlas-sse3-devel --enablerepo=epelyum -y install Cython --enablerepo=epelyum -y install python27yum -y install python27-numpy.x86_64yum -y install python27-numpy-f2py.x86_64yum -y install python27-scipy.x86_64/usr/local/bin/pip install --upgrade pipmkdir -p /home/ec2-user/stack/usr/local/bin/pip install moviepy -t /home/ec2-user/stackcp -R /usr/lib64/python2.7/dist-packages/numpy /home/ec2-user/stack/numpycp -R /usr/lib64/python2.7/dist-packages/scipy /home/ec2-user/stack/scipytar -czvf stack.tgz /home/ec2-user/stack/*第2步我将生成的tarball压缩到笔记本电脑中。然后运行此脚本以构建一个zip存档。#! /usr/bin/env bashmkdir tmprm lambda.ziptar -xzf stack.tgz -C tmpzip -9 lambda.zip process_movie.pyzip -r9 lambda.zip *.ttfcd tmp/home/ec2-user/stack/zip -r9 ../../../../lambda.zip *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')我不明白为什么python找不到文件夹结构中存在的核心目录。
查看完整描述

3 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

在此线程中的所有帖子的帮助下,这里是记录的解决方案:


要使其正常工作,您需要:


EC2用至少2GO RAM 启动一个实例(以便能够编译NumPy&SciPy)


安装所需的依赖项


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

将目录中所有目录的内容(_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

从您的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

将它们放在lib文件夹的子stack文件夹中


imageio是的依赖项moviepy,您需要下载其依赖项的一些二进制版本:libfreeimage和ffmpeg;他们可以在这里找到。将它们放在堆栈文件夹的根目录并重命名libfreeimage-3.16.0-linux64.so为libfreeimage.so


您现在应该拥有一个stack包含以下内容的文件夹:


根目录下的所有python依赖项

lib子文件夹中的所有共享库

ffmpeg 根目录二进制

libfreeimage.so 根源

压缩此文件夹: zip -r9 stack.zip . -x ".*" -x "*/.*"


使用以下内容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)

写一个movie_maker.py依赖于脚本moviepy,numpy...


将这些脚本添加到您的stack.zip文件中 zip -r9 lambda.zip *.py


上载zip S3并将其用作您的源lambda


您也可以在stack.zip 此处下载。


查看完整回答
反对 回复 2019-10-06
  • 3 回答
  • 0 关注
  • 631 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信