![](/img/trans.png)
[英]ctypes __del__ of ctypes.Structure subclass not invoked for pointers to structures
[英]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.