Python 通过指向ctypes中其他结构的指针传递结构

Python 通过指向ctypes中其他结构的指针传递结构,python,c,ctypes,Python,C,Ctypes,我正在尝试使用ctypes为C库制作python包装器。库中的函数要求传递指向结构的指针,该指针用作将来调用的句柄 此结构具有指向另一个内部结构的指针,该内部结构还具有指向其他结构的指针 typedef struct varnam { char *scheme_file; char *suggestions_file; struct varnam_internal *internal; } varnam; varnam_internal结构具有指向sqlite数据库

我正在尝试使用ctypes为C库制作python包装器。库中的函数要求传递指向结构的指针,该指针用作将来调用的句柄

此结构具有指向另一个内部结构的指针,该内部结构还具有指向其他结构的指针

typedef struct varnam {

    char *scheme_file;
    char *suggestions_file;
    struct varnam_internal *internal;

} varnam;
varnam_internal
结构具有指向sqlite数据库等的指针

struct varnam_internal
{
    sqlite3 *db;
    sqlite3 *known_words;

    struct varray_t *r;
    struct token *v;
    ...
}
根据SO的回答,我试图忽略varnam_的内部结构。差不多

class Varnam(Structure):
    __fields__ = [("scheme_file",c_char_p),
                  ("suggestions_file",c_char_p),("internal",c_void_p)]
但这似乎不起作用,因为我认为库需要分配
varnam_internal
,才能正常运行


我应该在python中实现所有依赖结构吗?ctypes适合这样包装库吗?我读过类似Cython的替代品,但我没有Cython的经验,所以这是否可行

没有理由在ctypes中定义
varnam_internal
结构,因为您不需要访问它。无论您是否定义结构,您正在调用的库都将分配它。无论遇到什么问题,都不是因为没有在ctypes中定义结构

确保您正确调用了
varnam_init
。它使用指向指针的指针作为参数,这意味着您不能直接使用
Varnam
类。您将需要执行以下操作:

from ctypes import *

class Varnam(Structure):
    __fields__ = [("scheme_file",c_char_p),
                  ("suggestions_file",c_char_p),
                  ("internal",c_void_p)]

varnam_ptr = POINTER(Varnam)

libvarnam = cdll.LoadLibrary("libvarnam.so") # on Linux
# libvarnam = cdll.libvarnam                 # on Windows

varnam_init = libvarnam.varnam_init
varnam_init.argtypes = [c_char_p, POINTER(varnam_ptr), POINTER(c_char_p)]

def my_varnam_init(scheme_file):
     handle = varnam_ptr()
     msg = c_char_p()
     r = varnam_init(scheme_file. handle.byref(), msg.byref())
     if r != 0:
          raise Exception(msg)
     return handle

上面的代码完全未经测试,但向您展示了如何调用
varnam_init

谢谢。没错,我创建了一个Varnam类的指针,并将其用于函数,而不是指向指针的指针。现在它可以完美地工作。