6

这是 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. 如何使用内存指针和已知数据类型初始化某种 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>

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

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

问候,

欧文

4

1 回答 1

7

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

1. PySwigObject A 中的包装指针可用作 A.__long__() 。

2. 可以使用 ctypes 将原始指针转换为可索引类型,如下所示

导入 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。

解决了。:)

于 2010-02-07T03:44:30.800 回答