使用Instagram的API进行网络应用程序。本练习所需要的一点是“在python代码中使用C库”,所以我使用CTYPES来调整ImageMagick以对照片应用过滤器。
所以,我有URL图像,我想应用过滤器:
from ctypes import *
factor = 2
libwand=CDLL("libMagick++.so.5")
libwand.MagickWandGenesis()
magick_wand = libwand.NewMagickWand()
#url_image is a simple url like http://www.images.com/123.jpg
libwand.MagickReadImage(magick_wand,url_image)
libwand.MagickBlueShiftImage(magick_wand,factor);
libwand.MagickWriteImage(magick_wand,'./login/static/images/imagenNueva.jpg');
如果我在一个简单的tets.py中执行此操作它可以正常工作,但是一旦我将它放在django的views.py中就会产生分段错误。
这是gdb输出:
编程接收信号SIGSEGV,分段故障。 kill()中的0x00007ffff782dfb7位于../sysdeps/unix/syscall-template.S:81 81 ../sysdeps/unix/syscall-template.S:文件或目录没有 存在。
答案 0 :(得分:0)
确保使用ctypes.CDLL
加载了正确的库。对于您执行的命令,我相信您需要libwand=CDLL("libMagickWand.so")
。发现正确库名称的最佳方法是使用MagickWand-config
实用程序在系统上找到正确的库名称。
此外,对于每个ctypes方法调用,您需要指定函数签名
# Tell ctypes that the return value is a pointer
libwand.NewMagickWand.restype = c_void_p
libwand.MagickReadImage.argtypes = [c_void_p, # MagickWand *
c_char_p] # char *
libwand.MagickBlueShiftImage.argtypes = [c_void_p, # MagickWand *
c_double] # double
如果没有将C-API映射到python,将导致错误,因为python将假设所有内容都是整数。
当然还有错误/异常处理
magick_wand = libwand.NewMagickWand()
if magick_wand is None:
raise MyException("Couldn't allocate memory")
ok = libwand.MagickReadImage(magick_wand,url_image)
if not ok:
raise MyException("Couldn't read image")