我正在尝试运行exiftool来读取python脚本中的图像元数据,作为AWS上lambda函数的一部分。
在运行Amazon Linux which is what the python3.6 runtime uses的ec2实例上,我可以下载该工具,将其解压缩,然后轻松运行。但是,尝试通过我的lambda函数中的python脚本执行此操作无效。
我的lambda函数如下:
import imageio
import subprocess
import utils
import os
import stat
import boto3
s3_client = boto3.client('s3')
# get exif tool
s3_client.download_file(
'zipped.code',
'Image-ExifTool-11.53.tar.gz',
'/tmp/Image-ExifTool-11.53.tar.gz')
p = subprocess.run('tar -zxvf Image-ExifTool-11.53.tar.gz', cwd='/tmp', shell=True)
def get_meta_data(im):
p = subprocess.Popen(
'/tmp/Image-ExifTool-11.53/exiftool -',
stdout=subprocess.PIPE,
stdin=subprocess.PIPE,
stderr=subprocess.PIPE,
shell=True)
out, err = p.communicate(input=imageio.imwrite('<bytes>', im, format='jpg'))
print(out) # b''
print(err) # b'/bin/sh: /tmp/Image-ExifTool-11.53/exiftool: /usr/bin/perl: bad interpreter: No such file or directory\n'
def lambda_handler(event, context):
src_key = event['src_key']
image = utils.download_image_to_memory(src_key)
print(get_meta_data(image))
我已经在本地运行了此代码,并且可以正常工作。如果我通过/usr/bin
在lambda函数中打印print(os.listdit('/usr/bin'))
的内容,则其中没有perl
可执行文件。但是,在具有Amazon Linux的ec2实例上的/usr/bin
目录中,存在perl
可执行文件。
我怀疑问题是我缺少perl(该工具是用perl编写的),但是考虑到lambda应该与Amazon linux映像一起运行,为什么没有perl解释器?
答案 0 :(得分:3)
尝试将https://p3rl.org/AWS::Lambda中列出的ARN之一添加到参考层中(那里有说明)。
我自己还没有做这件事,但是从我看到的一切来看,它都应该起作用。