2010-02-05 6 views
5

To jest pytanie Pythona. I mają zmiennąW języku Python, jak uzyskać dostęp do tablicy uint16 [3] zapakowanej przez SWIG (to znaczy odwijaj PySwigObject)?

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

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

Instancja przekazanego przez to ciągłe Tablica uint16 [3], problemem jest uzyskanie dostępu do tej tablicy Pythonie.

W Pythonie, w jaki sposób mogę utworzyć zmienną B o długości 3, która daje mi dostęp do odczytu/zapisu do tej samej pamięci wskazanej przez wskaźnik zawinięty w A?

Myślę, że problem ma dwie części:

  1. Jak uzyskać wskaźnik OUT A. (myślę 0x8c66fa0 punkty haust obiektu, a nie zawinięty obiektu).
  2. Jak zainicjować jakiś rodzaj tablicy Python za pomocą wskaźnika pamięci i znanego typu danych. (Numpy ma metodę frombuffer, ale wydaje się, że potrzebna jest metoda frommemory.) Być może będzie potrzebna jakaś obsada.

To powinno być łatwe, myślę, ale czytałem i hakowałem dłużej niż jeden dzień!

Aby rozwiązać drugą część, myślę przykładem może rozpocząć się w ten sposób:

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

następnie spróbuj zbudować B (niezależnie od ich typu wektorowego) przy użyciu „0x8902f00” i „uint16” i próbę jeśli zmienia B [2] powoduje zmiany w C [2].

Dziękujemy za sugestie lub wyraźny przykład.

Pozdrawiam,

Owen

Odpowiedz

6

po okresie dłuższym czytaniu i próbuje rzeczy na zewnątrz, odpowiedzi są następujące:

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

Następnie elementy mogą być potraktowane jako pA [0], Pa [ 1] itp.

pA wskazuje na tę samą pamięć co oryginalny obiekt, dlatego należy uważać, aby nie używać pA po usunięciu oryginalnego obiektu.

Oto przykład tylko dla drugiej części problem (na użyciu surowego wskaźnik znanego typu w Pythonie)

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 

Uruchomienie przykład w Pythonie pokazuje, że zarówno C [1] pC [1] zmieniono na 100.

Rozwiązany. :)

Powiązane problemy