あなたはCFFI経由PyXxx
CPythonの固有の構造体を渡すことはできません:あなたは、標準のCデータを渡す必要があります。通常、私はあなたが標準のCインタフェースを使用してCDEF() 'EDの機能を設計する必要があると答えるだろう、例えばのようなもの:
ffi.cdef("""
struct myimage_t {
int width, height;
float *data;
};
int read_image(struct myimage_t *output); // fill in '*output'
void free_image(struct myimage_t *img); // free output->data
""")
myimage = ffi.new("struct myimage_t *")
if lib.read_image(myimage) < 0:
raise IOError
...
lib.free_image(myimage)
は、その後、あなたはどこかで、手動でnumpyの配列にmyimage
を変換する必要があります上記の "..."コード。
もう1つの選択肢は、Pythonコールバックを使用することです。コールバックは、numpy配列をspecに従って作成し、C標準のfloat *
ポインタを返します。 numpy配列自体は、コールバックのどこかに保存されます。あなたはPythonのグローバルとして保存するか、Cで渡す "ハンドル"をもっときれいに使うことができます.ABIではなくAPIバージョンが必要です。 、
興味深い
from _example_cffi import ffi, lib
class Context:
pass
@ffi.def_extern()
def alloc_2d_numpy_array(handle, w, h):
context = ffi.from_handle(handle)
context.image = np.ndarray([w, h], dtype=np.float32)
return ffi.cast("float *", ffi.from_buffer(context.image))
context = Context()
lib.read_image(ffi.new_handle(context))
image = context.image
お返事に感謝:
ファイルexample.pyで:_example_build.pyで。私たちはこれを行うことができないのは残念です...私たちはnumpyの配列C APIへのアクセスを失います。トーチでは、FFIを使用して行列オブジェクトに簡単に直接アクセスでき、多くの手助けをします。 –
あなたのx86実行可能ファイルがARMスマートフォンでこれ以上動作しないのは悲しいことです。 CPython C APIを使用してPyObjectsを操作するコードをお持ちの場合、それはcffiでは動作しません。これはcffiの設計目標の一部です。私の答えは、cffiの手法を使って同じ結果を得る方法の例を示しています--- Pythonオブジェクトにアクセスする必要があるときはいつでもPythonでコールバックを書いています。 –