私は、Cythonを使ってPython用のCライブラリ用の高水準インタフェースを作成しています。
私はより複雑なCコンテキスト構造体へのポインタでライブラリを初期化するタイプA
を持っていますc_context
。ポインタはA
に保存されます。
A
もdef
関数を持ちます。これは、別のC構造体をライブラリ関数呼び出しで初期化するタイプB
を作成します。この構造体は、B
で作成されたそれ以降のライブラリ呼び出しに必要です。
B
B
から__cinit__
にそれを渡すために、拡張タイプpy_context
内私によって包まれA
からc_context
ポインタ必要があります:正しいCのコンテキストでラッパーを渡すCythonを使ってC Structの周りに完全なPythonラッパーを書くには?
#lib.pxd (C library definitions)
cdef extern from "lib.h":
ctypedef struct c_context:
pass
#file py_context.pxd
from lib cimport c_context
cdef class py_context:
cdef c_context *context
cdef create(cls, c_context *context)
cdef c_context* get(self)
#file py_context.pyx
def class py_context:
@staticmethod
cdef create(cls, c_context *c):
cls = py_nfc_context()
cls.context = c
return cls
cdef c_context* get(self):
return self.context
を完璧に動作します。
今度は、py_context
からC構造体を再度取得し、B
に保存する必要があります。私はcdef c_context get(self)
にpy_context.pxd/pyx
を加えました。 アメニティー__cinit__
結果からpy_context.get()
を呼び出す:Cythonでcdef
関数を呼び出すときに私は周りに私の頭を取得しないように思えAttributeError: py_context object has no attribute get.
。
私の質問は:ラッパークラスからC構造体を再度抽出する最良の方法は何ですか?
これはお使いになりましたか? http://docs.cython.org/src/tutorial/clibraries.html – chrisb