Python class 对象指针的 ctypes argtypes

Python ctypes argtypes for class object pointer

我有这个 C++ 代码可以将基于 class Foo 的代码集成到 python.

class Foo{
public:
    Foo(){};
    int do_thing(int arg){ return arg*2; }
};

extern "C" {
Foo* get_foo_obj(){
    return new Foo;
}

int do_thing(Foo* ptr, int arg){
    return ptr->do_thing(arg);
}
}

现在我想为 python 中的函数分配 argtypesrestype

lib = ctypes.CDLL("mylib.so")
lib.get_foo_obj.restype = <POINTER?>
lib.do_thing.argtypes = (<POINTER?>, c_int)
lib.do_thing.restype = c_int

我需要在这里使用的正确 ctypes 是什么?

ctypes.c_void_p 有效(void* 在 C 中),尽管您可以使用不透明的指针类型来提高类型安全性,例如:

import ctypes as ct

class Foo(ct.Structure):
    pass

lib = ct.CDLL('mylib.so')
lib.get_foo_obj.argtypes = ()
lib.get_foo_obj.restype = ct.POINTER(Foo)
lib.do_thing.argtypes = ct.POINTER(Foo), ct.c_int
lib.do_thing.restype = ct.c_int

foo = lib.get_foo_obj()
print(lib.do_thing(foo, 5))