Ошибка сегментации в типах ImageMagick + Python - PullRequest
0 голосов
/ 27 октября 2011

Я использую библиотеку ImageMagick с Python ctypes. Я написал следующий простой код, но он вылетает из-за ошибки сегментации (KERN_INVALID_ADDRESS) в Mac:

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() возвращает неправильный указатель, или ctypes в Mac неправильно обрабатывает указатели, но я не уверен.

Что не так в этой ситуации?

Ответы [ 2 ]

1 голос
/ 27 октября 2011

Я изменил следующий код:

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

на:

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

Итак, он работает хорошо.

0 голосов
/ 27 октября 2011

Скорее всего, это проблема 32/64 бит.Является ли версия для Mac единственным 64-битным процессом, который вы тестировали?Или, возможно, вам повезло в версиях для Windows и Linux в том, что они возвращают указатели в виде 0x00000000xxxxxxxx.

wand = lib.NewMagickWand()

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

lib.NewMagickWand.restype = c_void_p

Это говорит ctypes, что NewMagickWand возвращает указатель.

...