我有一个C / C ++结构,其中包含一个对象(例如STL容器)。我想使用ctypes从Python访问它。例如,
C / C ++:
struct Foo {
int bar;
vector<int> baz;
double quxx;
}
Python ctypes:
from ctypes import *
class Foo(Structure):
_fields_ = [
("bar", c_int),
("baz", ???), <--- what do i put here?
("quxx", c_double),]
我意识到我无法在不创建包装函数的情况下使用ctypes访问STL容器,但能够访问“bar”和“quxx”会很高兴。我能够做到这一点的唯一方法是只处理不透明的指针和包装函数,例如。
C / C ++:
int Foo_bar(*Foo foo) { return foo->bar; }
...
的Python
class Foo_p(c_void_p): pass
my_Foo_p = ... somehow get a Foo pointer ...
bar = mylib.Foo_bar(my_Foo_p)
这看起来很笨拙。有没有办法为包含C ++对象的C结构创建ctypes.Structure?也许使用sizeof?
答案 0 :(得分:0)
如果它包含一个C ++类作为成员,那么不是一个C-struct。 struct
和class
是相同的关键字,但struct
默认为public
所有成员而不是private
。
那就是说,如果你错了,那么你是否愿意冒鼻子风险,你可以使用隐藏的知识。在unixy平台上使用的两个主要库中,vector
内部包含三个指针,因此您可以使用它。我不知道Windows实现使用什么,但Windows无论如何都没有稳定的ABI。