Я пытаюсь вызвать функцию 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
В моем вопросе была опечатка, от вырезания и вставки, проблема все еще существует!