“解码器 jpeg 不可用”在 AWS Elastic Beanstalk 上使用 Pillow

Posted

技术标签:

【中文标题】“解码器 jpeg 不可用”在 AWS Elastic Beanstalk 上使用 Pillow【英文标题】:"decoder jpeg not available" with Pillow on AWS Elastic Beanstalk 【发布时间】:2014-09-22 12:25:16 【问题描述】:

我在 AWS Elastic Beanstalk 下的 Python 上处理 jpeg 文件时遇到了一些麻烦。

我在 .ebextensions/python.config 文件中有这个:

packages:
 yum:
  libjpeg-turbo-devel: []
  libpng-devel: []
  freetype-devel: []
...

所以我相信我已经安装并运行了 libjpeg(我尝试了 libjpeg-devel,但 yum 找不到这个包)。

另外,我的 requirements.txt 中有这个:

Pillow==2.5.1
...

所以我相信我已经安装了 Pillow 并在我的环境中工作。

然后,由于我有 Pillow 和 libjpeg,我正在尝试在 Python 脚本中使用 PIL.Image 做一些工作并保存到文件中。像这样:

from PIL import Image

def resize_image(image,new_size,crop=False,correctOrientationSize=False):
  assert type(new_size) == dict
  assert new_size.has_key('width') and new_size.has_key('height')

  THUM_SIZE = [new_size['width'],new_size['height']]

  file_like = cStringIO.StringIO(base64.decodestring(image))
  thumbnail = Image.open(file_like)

  (width,height) = thumbnail.size
  if correctOrientationSize and height > width:
    THUM_SIZE.reverse()

  thumbnail.thumbnail(THUM_SIZE)

  if crop:
    # Recorta imagem
    thumbnail = crop_image(thumbnail)
  output = cStringIO.StringIO()
  thumbnail.save(output,format='jpeg')

return output.getvalue().encode('base64')

但是,当我尝试在 Elastic Beanstalk 的实例上运行它时,当它调用 .save() 方法时出现异常“解码器 jpeg 不可用”。

如果我通过 SSH 连接到我的实例,它可以正常工作,并且我已经尝试重建环境。

我做错了什么?

更新:

按照建议,我再次通过 SSH 进入实例并通过 pip (/opt/python/run/venv/bin/pip) 重新安装 Pillow,而不是在我确定 libjpeg-devel 在 Pillow 之前的环境中之前。

我运行了 selftest.py,它确认我支持 jpeg。所以,在最后一次尝试中,我去了 Elastic Beanstalk 界面上的“重新启动应用程序服务器”。有效。

谢谢大家。

【问题讨论】:

你是在 Pillow 之前还是之后安装 libjpeg 的? 我的经验是 libjpeg 在安装枕头时必须存在。确定已安装 libjpeg 后,尝试卸载枕头并重新安装。 软件包在处理 requirements.txt 之前安装。您能否对日志进行快照以查看日志中是否出现任何错误? docs.aws.amazon.com/elasticbeanstalk/latest/dg/… @PedroAlves:请您在下面的答案框中添加您的答案吗?这样就不会显示为未答复,其他人可以更快地找到解决方案。 @Hugo 当然。完成了。 【参考方案1】:

按照here 的一般建议,我通过在 .ebextensions 配置中添加以下内容并重新部署解决了这个问题。

packages:
  yum:
    libjpeg-turbo-devel: []
    libpng-devel: []
    freetype-devel: []

container_commands:
...
  05_uninstall_pil:
    command: "source /opt/python/run/venv/bin/activate && yes | pip uninstall Pillow"

  06_reinstall_pil:
    command: "source /opt/python/run/venv/bin/activate && yes | pip install Pillow --no-cache-dir"

【讨论】:

【参考方案2】:

按照建议,我再次通过 SSH 进入实例并通过 pip (/opt/python/run/venv/bin/pip) 重新安装 Pillow,而不是在我确定 libjpeg-devel 在 Pillow 之前的环境中之前。

我运行了 selftest.py,它确认我支持 jpeg。所以,在最后一次尝试中,我去了 Elastic Beanstalk 界面上的“重启应用服务器”。它奏效了。

【讨论】:

以上是关于“解码器 jpeg 不可用”在 AWS Elastic Beanstalk 上使用 Pillow的主要内容,如果未能解决你的问题,请参考以下文章

sorl-thumbnail 不显示图像

Flask 应用程序未在 AWS 弹性 beantalk 上部署

我可以在一个 AWS Elastic Beanstalk 应用程序中拥有多个网站吗?

如何在 Maven 构建中包含随机文件以在 AWS EBS 上部署 WAR 文件?

AWS Elasticbeanstalk 使用 .platform 覆盖 Nginx 配置不起作用

如何使用适用于 Python 的 AWS CDK 通过 ARN 查找现有的经典负载均衡器 (CLB)?