ImageMagick + Python ctypes的分段错误

时间:2011-10-27 05:22:08

标签: python macos imagemagick segmentation-fault ctypes

我正在使用带有Python ctypes的ImageMagick库。我写了一个下面的简单代码,但它崩溃了Mac中的分段错误(KERN_INVALID_ADDRESS):

from ctypes import *
from ctypes.util import find_library

lib = CDLL(find_library('MagickWand'))
lib.MagickWandGenesis()
wand = lib.NewMagickWand()
lib.MagickReadImage(wand, 'mona-lisa.jpg')
lib.DestroyMagickWand(wand)
lib.MagickWandTerminus()

它在Linux和Windows中都运行良好,但只在Mac OS X Lion中使用。我以各种方式构建了ImageMagick(官方二进制包,Homebrew,传统的./configure && make),但每次试用都会崩溃。

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x00000000009a7638
0x000000010149a8d1 in MagickReadImage ()

不仅MagickReadImage()函数,IsMagickWand()函数也崩溃了。我猜只有NewMagickWand()会返回错误的指针,或者Mac中的ctypes会错误地处理指针,但我不确定。

在这种情况下出了什么问题?

2 个答案:

答案 0 :(得分:1)

我更改了以下代码:

lib.MagickReadImage(wand, 'mona-lisa.jpg')

为:

f2 = lib.MagickReadImage
f2.argtypes = [c_void_p, c_char_p]
f2(wand, 'mona-lisa.jpg')

所以,它运作良好。

答案 1 :(得分:0)

这很可能是32/64位问题。 Mac版本是您测试过的唯一64位进程吗?或许你在Windows和Linux版本中幸运的是它们碰巧返回0x00000000xxxxxxxx形式的指针。

wand = lib.NewMagickWand()

NewMagickWand返回一个指针,但你没有告诉ctypes期望一个指针。因为它代表ctypes默认为返回值的32位整数。在调用NewMagickWand之前添加此行。

lib.NewMagickWand.restype = c_void_p

这告诉ctypes NewMagickWand返回一个指针。