簡體   English   中英

傳遞帶有指向ctypes中其他結構的指針的結構

[英]Passing structure with pointers to other structures in ctypes

我正在嘗試使用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_internal結構。 就像是

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM