In Python, wie ein uint16 [3] Array von SWIG (d.h. unwrap a PySwigObject) gewickelt zuzugreifen?

StackOverflow https://stackoverflow.com/questions/2209395

  •  18-09-2019
  •  | 
  •  

Frage

Dies ist Python Frage. Ich habe eine Variable A

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

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

Die Instanz durch A bezeichnet ist, eine zusammenhängende Anordnung uint16 [3] und das Problem ist, den Zugriff auf das Array von Python zu gewinnen.

In Python, wie kann ich eine Variable B der Länge 3, die mich Schreibzugriff auf den gleichen Speicher durch die in A eingewickelt Zeiger zeigt Lese- / gibt?

Ich denke, das Problem hat zwei Teile:

  
      
  1. Wie Sie den Zeiger aus A. zu bekommen (ich glaube, 0x8c66fa0 Punkte zu einem Swig Objekt, nicht das umhüllte Objekt).
  2.   
  3. Wie eine Art von Python-Array zu initialisieren, einen Speicherzeiger und einen bekannten Datentyp. (Numpy hat eine frombuffer Methode, aber was scheint nötig zu sein, um frommemory Methode.) Vielleicht werden einige Gießen benötigt werden.
  4.   

Dies sollte einfach sein, denke ich, aber ich habe gelesen, und Hacking für mehr als einen Tag!

, um den zweiten Teil zu lösen, denke ich, ein Beispiel auf diese Weise beginnen könnte:

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

Dann versuchen Sie B (von was auch immer Vektor-Typ) zu bauen "0x8902f00" und "uint16" und Test, wenn B zu ändern [2] führt zu Veränderungen in C [2].

Vielen Dank für Ihre Anregungen oder ein anschauliches Beispiel.

Grüße,

Owen

War es hilfreich?

Lösung

Nach mehr lesen und zu versuchen, Sachen aus, die Antworten sind wie folgt:

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

Dann können die Elemente als pA angesprochen werden [0], pA [1] usw.

pA zeigen auf den gleichen Speicher wie das ursprüngliche Objekt, also darauf achten, nicht pA zu verwenden, nachdem das ursprüngliche Objekt gelöscht wird.

Hier ist ein Beispiel für nur den zweiten Teil des Problems (auf einen Rohzeiger bekannte Art in 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

das Beispiel in Python ausführen, werden zeigt, dass sowohl C [1] und pC [1] wird auf 100 geändert.

Gelöst. :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top