如何在python ctypes中包装包含C ++对象的C结构

时间:2014-10-08 07:05:34

标签: python c++ struct stl ctypes

我有一个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?

1 个答案:

答案 0 :(得分:0)

如果它包含一个C ++类作为成员,那么不是一个C-struct。 structclass是相同的关键字,但struct默认为public所有成员而不是private

那就是说,如果你错了,那么你是否愿意冒鼻子风险,你可以使用隐藏的知识。在unixy平台上使用的两个主要库中,vector内部包含三个指针,因此您可以使用它。我不知道Windows实现使用什么,但Windows无论如何都没有稳定的ABI。