我正在使用带有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
会错误地处理指针,但我不确定。
在这种情况下出了什么问题?
答案 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返回一个指针。