2014-10-08 127 views
1

我有一個包含對象(例如STL容器)的C/C++結構。我想使用ctypes從Python訪問此結構。例如,如何在Python ctypes中包含包含C++對象的C結構

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

爲什麼你需要那個?無論如何,如果包含的C++對象具有不平凡的構造函數或析構函數,您將無法以任何可靠的方式使用Foo對象。 – filmor 2014-10-08 07:47:22

+0

我知道從Python構建和銷燬這樣的對象是不可能的,但我想要做的就是訪問它的基本C類型的成員。 – user3533069 2014-10-08 16:24:34

回答

0

如果它包含一個C++類作爲成員,則它是而不是的C結構。 structclass是相同的關鍵字,但struct默認爲public而不是private

這就是說,如果你願意冒險鼻惡魔,如果你錯了,你可以使用隱藏的知識。在unixy平臺上使用的兩個主庫中,vector內部包含三個指針,因此您可以使用它。我不知道Windows實現使用什麼,但Windows無論如何都沒有穩定的ABI。

+0

不是矢量只是1指針和size_t?我不認爲需要2個其他的指針,因爲矢量總是分配爲連續的內存塊,而不是鏈接列表或其他數據結構 – Creris 2014-10-08 07:59:39

+0

@TheOne它需要一個容量和一個大小。自從'sizeof(void *)== sizeof(size_t)'以來,它並沒有真正的區別,但是對於內部實現的目的來說,事實證明,存儲指針用於結束使用數據和結束分配比稍微容易一些它是存儲整數。不可否認,其中的一部分僅僅是迭代器對思維方式。 – o11c 2014-10-08 08:02:47

+0

啊是啊,我忘了能力。 – Creris 2014-10-08 08:03:37