В Python, как получить доступ к массиву uint16[3], перенесенному БОЛЬШИМ ГЛОТКОМ (т.е. развернуть PySwigObject)?

Это - вопрос о 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, как я могу создать переменную B длины 3, который дает мне доступ для чтения-записи к той же памяти, на которую указывает указатель, перенесенный в 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" и тест при изменении изменений причин B[2] в C[2].

Большое спасибо за Ваши предложения или ясный пример.

С уважением,

Owen

6
задан Owen 5 February 2010 в 18:24
поделиться

1 ответ

После дополнительного чтения и проверки, ответы будут следующими:

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

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.

Решено. :)

7
ответ дан 17 December 2019 в 00:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: