Вызов функции с использованием ctypes с указателями на структуры - PullRequest
4 голосов
/ 02 декабря 2009

Я пытаюсь вызвать функцию C, находящуюся в общем объекте из python, и использование ctypes, кажется, лучший способ сделать это. Я должен передать производные типы этой функции со следующим прототипом функции:

int MyFunc (Config *config, int *argc, char **argv )

Структура Config определяется как

 typedef struct{ char *some_filename ;
                 char **some_other_filenames ;
                 int some_value ;
                 Coord resolution;
               } Config; 

Coord определяется как

 typdef struct { double x, y, area }  Coord ;

Затем код Python ctypes просто переписывает производные типы:

 class COORD ( ctypes.Structure ):
       _fields = [ ("lon",ctypes.c_double),\
       ("lat", ctypes.c_double),\
       ("area", ctypes.c_double)]
 coords = COORD()
 class CONFIG( ctypes.Structure ):
       _fields = [ ("some_filename", ctypes.c_char_p),\
       ("some_other_filenames", ctypes.c_char_p('\0' * 256)),\
       ("some_value", ctypes.c_int ),\
       ("resolution", coords )   ]

Затем я установил аргументы для MyFunc:

 MyFunc.argtypes = [ctypes.byref(CONFIG ) , ctypes.POINTER(ctypes.c_int),\
        ctypes.POINTER (ctypes.c_char_p)]
 MyFunc.restype = ctypes.c_int 
 myargv = ctypes.c_char_p * 2
 argv = myargv("One", "Two")
 argc = ctypes.c_int ( 2 )
 retval = MyFunc (  ctypes.byref(config), ctypes.byref(argc), ctypes(argv))

Это, однако, приводит к segfault. У кого-нибудь есть идеи, что здесь происходит?

UPDATE В моем вопросе была опечатка, от вырезания и вставки, проблема все еще существует!

Ответы [ 2 ]

2 голосов
/ 08 декабря 2009

char ** соответствует POINTER (c_char_p), а не c_char_p.

1 голос
/ 03 декабря 2009

Не похоже, что ваша переписанная структура конфигурации совпадает с оригинальной. Если вы передадите его туда-сюда, выравнивание будет отключено.

Редактировать: Я вижу, вы исправили часть этого. Но я не уверен, что c_char_p такой же, как char **.

...