Python,액세스하는 방법 uint16[3]배열에 의해 감싸는 약(i.e풀 다 PySwigObject)?

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

  •  18-09-2019
  •  | 
  •  

문제

이것은 파이썬은 질문입니다.나는 변수

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

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

인스턴스에 의해 추천은 연속 배열 uint16[3]그 문제에 대한 액세스 권한을 얻는 배열에서 Python.

Python,어떻게 만들 수 있습니 변 B 길이의 3,제공하는 나에게 읽기/쓰기 권한을 같은 메모리를 가리키는 포인터에 싸여?

나는 생각한 문제는 두 부분으로 구성됩니다.

  1. 을 얻는 방법 포인터 밖의 A.(나는 생각한 0x8c66fa0 점을 꿀꺽 한 객체지 감 object).
  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].

많은 감사에 대한 당신의 제안이나 분명한 예입니다.

감사합니다,

오웬

도움이 되었습니까?

해결책

후에 더 많은 독서를 하려고 물건에 대한 답변은 다음과 같습니다:

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

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

실행의 예제에서는 파이썬다는 것을 보여줍 C[1]와 pC[1]이 변경되었을 100.

해결합니다.:)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top