在Python中,如何访问由SWIG包装的uint16 [3]数组(即展开PySwigObject)?

时间:2010-02-05 18:24:12

标签: python swig ctypes

这是Python的问题。我有一个变量A

>>> 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指向Swig对象,而不是包装对象。)
  2.   
  3. 如何使用内存指针和已知数据类型初始化某种Python数组。 (Numpy有一个frombuffer方法,但似乎需要的是一个记忆方法。)也许需要一些铸造。
  4.   

我认为这应该很容易,但我已经阅读和黑客超过一天了!

为了解决第二部分,我想一个例子可以这样开始:

>>> 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>

然后尝试使用“0x8902f00”和“uint16”构建B(任何矢量类型)并测试是否更改B [2]会导致C [2]中的更改。

非常感谢您的建议或明确的例子。

此致

欧文

1 个答案:

答案 0 :(得分:7)

经过更多的阅读和尝试后,答案如下:

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.

解决。 :)