Это - вопрос о 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?
Я думаю, что проблема имеет две части:
- Как вытащить указатель из A. (Я думаю точки 0x8c66fa0 к объекту Большого глотка, не перенесенному объекту).
- Как инициализировать некоторый массив 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
После дополнительного чтения и проверки, ответы будут следующими:
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.
Решено. :)