Python,액세스하는 방법 uint16[3]배열에 의해 감싸는 약(i.e풀 다 PySwigObject)?
문제
이것은 파이썬은 질문입니다.나는 변수
>>> 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,제공하는 나에게 읽기/쓰기 권한을 같은 메모리를 가리키는 포인터에 싸여?
나는 생각한 문제는 두 부분으로 구성됩니다.
- 을 얻는 방법 포인터 밖의 A.(나는 생각한 0x8c66fa0 점을 꿀꺽 한 객체지 감 object).
- 어떻게를 초기화하는 어떤 종류의 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.
해결합니다.:)
제휴하지 않습니다 StackOverflow