Python Wand и ImageMagick на AWS Lambda



Попытка запустить Wand на AWS Lambda для некоторых простых манипуляций с изображениями.



До сих пор я:




  1. создал экземпляр, идентичный лямбда-среде


  2. Установлен imagemagick из исходного кода



    wget ImageMagick
    cd ImageMagick-...
    ./configure --prefix=/home/ec2-user/im --without-x
    make && make install


  3. Установить MAGICK_HOME в /home/ec2-user/im/


  4. pip install wand



Но когда я пытаюсь импортировать палочку.изображение, которое я получаю:

import wand.image
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/ec2-user/cv/local/lib64/python2.7/site-packages/wand/image.py", line 20, in <module>
from .api import MagickPixelPacket, libc, libmagick, library
File "/home/ec2-user/cv/local/lib64/python2.7/site-packages/wand/api.py", line 206, in <module>
'Try to install:n ' + msg)
ImportError: MagickWand shared library not found.
You probably had not installed ImageMagick library.
Try to install:
http://docs.wand-py.org/en/latest/guide/install.html


Это прекрасно работает, когда я делаю yum install ImageMagick, но так как я хочу связать его, я подумал, что мне нужно будет включить двоичный и направьте на него установку палочки.



Какие-нибудь мысли?

592   2  

2 ответов:

Поскольку теперь кто-то еще заинтересован, я решил эту проблему и в настоящее время управляю своими лямбда-проектами, аналогичными приведенным ниже.

Структура папок

-project
  -init_libs.py
  -lambda_function.py
  -libs
    -libMagickWand-6.Q16.so
    -libMagickCore-6.Q16.so
    -libMagick++-6.Q16.so
  -site-packages
    -wand
  -other_modules

init_libs.py загружает собственные библиотеки, такие как Wand.

import sys
import os
from ctypes import cdll
from os.path import join

# manually load libraries and set paths so native libraries can be used.
exec_dir = os.getcwd()
sys.path.append(join(exec_dir, 'site-packages'))

# required for Wand
os.environ['MAGICK_HOME'] = exec_dir

lib_dir = join(exec_dir, 'lib')

# add lib to sys path for general loading
sys.path.append(lib_dir)

lambda_function.py Теперь можно импортировать палочку

from wand.image import Image

print Image

Это может быть не очень полезно для заданного вопроса, но если желаемой целью является простое преобразование файлов (pdf в jpg/png и т. д.) можно обойти wand и вызвать ImageMagick / GhostScript напрямую (они упакованы в среду Python3.6 AWS).

Например

# converts local pdf to jpg using ImageMagick
os.system("convert -density 200x200 /tmp/in_pdf.pdf /tmp/out_jpg.jpg")

# converts local pdf to jpg using GhostScript
os.system(
        "gs -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT "
        "-dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "
        "-sDEVICE=jpeg -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -r150 "
        "-sOutputFile=/tmp/out_jpg-%d.jpg /tmp/in_pdf.pdf"
    )

Причина, по которой я использую /tmp в качестве расположения файла, заключается в том, что lambda позволяет хранить файлы размером до 500 МБ во время выполнения функции lambda.

Надеюсь, это кому-то поможет!

Comments

    Ничего не найдено.