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

2024-10-03 21:24:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

此结构有指向另一个内部结构的指针,而另一个内部结构又有指向其他结构的指针。在

typedef struct varnam {

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

} varnam;

varnam_internal结构有指向sqlite数据库的指针,等等

^{pr2}$

我试着根据this忽略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没有经验,所以这是否可行?在


Tags: 函数ctypes句柄结构structcythonfileinternal
1条回答
网友
1楼 · 发布于 2024-10-03 21:24:24

没有理由在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。在

相关问题 更多 >