我正在尝试运行一个exiftool,以读取python脚本中的图像元数据,这是AWS上的lambda函数的一部分。
在运行Amazon Linux的EC2实例上,这是Python3.6运行时使用的,我可以下载该工具,提取它,然后轻松运行。但是,尝试从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 directoryn'
def lambda_handler(event, context):
src_key = event['src_key']
image = utils.download_image_to_memory(src_key)
print(get_meta_data(image))
我在本地运行了此代码,并且有效。如果我通过print(os.listdit('/usr/bin'))
在lambda函数中打印/usr/bin
的内容,则其中没有perl
可执行文件。但是,在使用Amazon Linux的EC2实例上的/usr/bin
目录中,perl
可执行。
我怀疑问题是我缺乏perl(工具是用perl编写的(,但是为什么没有perl解释器鉴于Lambdas应该使用Amazon Linux映像运行?
尝试将https://p3rl.org/aws:: lambda中列出的ARN之一添加到您的引用层中(那里有说明(。
我自己还没有做到这一点,但是从我所看到的一切开始都应该起作用。