在Amazon Lambda中使用moviepy,scipy和numpy

我想使用AWS Lambda功能生成视频。


我已按照此处和此处的说明进行操作。


现在,我具有以下过程来构建我的Lambda功能:


第1步

触发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/*

第2步

我将生成的tarball压缩到笔记本电脑中。然后运行此脚本以构建一个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 脚本目前仅是测试堆栈是否正常的测试:


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找不到文件夹结构中存在的核心目录。


德玛西亚99
浏览 632回答 3
3回答

largeQ

在此线程中的所有帖子的帮助下,这里是记录的解决方案:要使其正常工作,您需要:EC2用至少2GO RAM 启动一个实例(以便能够编译NumPy&SciPy)安装所需的依赖项sudo yum -y updatesudo yum -y upgradesudo yum -y groupinstall "Development Tools"sudo yum -y install blas --enablerepo=epelsudo yum -y install lapack --enablerepo=epelsudo yum -y install Cython --enablerepo=epelsudo yum install python27-devel python27-pip gccvirtualenv ~/envsource ~/env/bin/activatepip install scipypip install numpypip install moviepy将目录中所有目录的内容(_markerlib,pip *,pkg_resources,setuptools *和easyinstall *除外)复制到您的语言环境计算机中stack:home/ec2-user/env/lib/python2.7/dist-packageshome/ec2-user/env/lib64/python2.7/dist-packages从您的EC2实例获取所有必需的共享库:libatlas.so.3libf77blas.so.3liblapack.so.3libptf77blas.so.3libcblas.so.3libgfortran.so.3libptcblas.so.3libquadmath.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作为您的切入点lambdafrom __future__ import print_functionimport osimport subprocessSCRIPT_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 此处下载。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python