Pythonでは、どのようにアクセスuint16[3]配列によってラップされたSWIG(unwrap、PySwigObject)?

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

  •  18-09-2019
  •  | 
  •  

質問

これはPythonの質問です。いての変数は、

>>> 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では、作成方法を教えてください変数Bの長さは3を与えてくれるの読み取り/書き込みアクセスと同じメモリを指摘のポインタに包まれた。

と思うので問題は二つのパーツ:

  1. どのようにポインタのA.(いと思い0x8c66fa0ポイントをSwigのオブジェクトなのに包まれたオブジェクト
  2. どのようにinitialiseのPythonの配列を使用メモリのポインタと既知のデータ型になります。(ても済むは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]、[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

の例はPythonすることがC[1]pC[1]に変更された100です。

解決しました。:)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top