使用带有指向结构的指针的ctypes调用函数

时间:2009-12-02 20:04:03

标签: python c ctypes

我试图将一个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))

然而,这会产生段错误。任何人都有任何想法在这里发生了什么?

更新 在我的问题中有一个错字,从切割和粘贴,问题仍然存在!

2 个答案:

答案 0 :(得分:2)

char **对应POINTER(c_char_p),而不是c_char_p。

答案 1 :(得分:1)

看起来您的重写配置结构与原始配置结构不同。如果你来回传递,那么对齐就会消失。

编辑:我看到你修复了部分内容。但我不确定c_char_p是否与char **相同​​。