2010-02-05 17 views
5

這是Python的問題。我有一個變量A在Python中,如何訪問由SWIG包裝的uint16 [3]數組(即展開PySwigObject)?

>>> A 
<Swig Object of type 'uint16_t *' at 0x8c66fa0> 

>>> help(A) 
class PySwigObject(object) 
    Swig object carries a C/C++ instance pointer 

由A所指的實例是一個連續數組UINT16 [3]和問題是能夠訪問在Python該陣列。

在Python中,我該如何創建一個長度爲3的變量B,使我可以讀/寫訪問由A中包含的指針所指向的同一內存?

我認爲這個問題有兩個部分:

  1. 如何得到的指針出A的(我認爲0x8c66fa0指向痛飲對象,而不是被包裝的對象)。
  2. 如何使用內存指針和已知數據類型初始化某種Python數組。 (Numpy有一個frombuffer方法,但似乎需要的是frommemory方法。)也許需要一些鑄造。

這應該很容易,我認爲,但我一直在閱讀和黑客超過一天!

要解決的第二部分,我想一個例子可以開始這樣說:

>>> import numpy 
>>> C = numpy.ascontiguousarray([5,6,7],"uint16") 
>>> C 
array([5, 6, 7], dtype=uint16) 
>>> C.data 
<read-write buffer for 0x8cd9340, size 6, offset 0 at 0x8902f00> 

然後嘗試建立如果改變b。使用「0x8902f00」和「UINT16」和試驗(無論矢量型)乙[2]引起C [2]的變化。

非常感謝您的建議或一個明確的例子。

問候,

歐文

回答

6

更多的閱讀,並試圖東西出來後,將答案如下:

 
1. The wrapped pointer in PySwigObject A is available as A.__long__() . 

2. A raw pointer can be cast into an indexable type using ctypes as follows 

import ctypes 
pA = ctypes.cast(A.__long__(), ctypes.POINTER(ctypes.c_uint16)) 

然後,元件可以被尋址爲PA [0],PA [ 1]等

pA指向與原始對象相同的內存,因此注意在刪除原始對象後不要使用pA。

這裏是只是問題的第二部分的例子(使用在Python已知類型的原始指針),

C = numpy.ascontiguousarray([5,6,7],"uint16") # make an array 
C 
rawPointer = C.ctypes.data 
pC = ctypes.cast(rawPointer, ctypes.POINTER(ctypes.c_uint16)) 
pC[0:3] 
pC[1]=100 
pC[0:3] 
C 

運行在Python例子表明,無論是C [1]和pC [1]已被更改爲100.

已解決。 :)