私はCtypes
を通して呼び出すCライブラリ(clib
とヘッダclib.h
)を持っています。 get_struct
は、構造体Foo
へのポインタを返します。このポインタは、clib.h
で前方宣言されていて、他の関数呼び出しのためにポインタとして使用できます(use_struct(Foo* foo)
など)。私はCython
で同じ関数コードを呼び出すために、このポインタを使用したいと思います。ctypes構造体をcythonに渡す
私は構造の内容を知らないので、私はcythonで重複した構造を作り、ctypes構造の値をコピーすることはできません。だから私は代わりに、同じAPIをバインドするいくつかのCコードを呼び出すために同じメモリ空間へのcythonポインタを作成したいと思います。
コードはおおよそこれを行っています。
cdef extern from "clib.h":
cdef struct Foo:
pass
void use_struct(Foo *)
cpdef bar(foo_ct):
cdef Foo* foo_cy
foo_cy = <Foo*>&foo_ct # or something equivalent
cy_use_struct(foo_cy)
Cythonについて:cylib.pyxでCython側で
# load clib DLL
clib = ctypes.CDLL('clib.so')
# empty Ctypes declaration
class Foo_ct(ctypes.Structure):
pass
# get and use the struct
clib.get_struct.restype = ctypes.POINTER(Foo_ct)
foo_ct = clib.get_struct()
clib.use_struct(foo_ct)
# call cython code
bar(foo_ct)
:
typedef struct Foo Foo;
Foo * get_struct();
void use_struct(Foo *)
のctypesとPythonの側:clib.hで
側、in cylibc.cpp:
#import "clib.h"
void cy_use_struct(Foo * foo)
{
use_struct(foo);
}
foo_cy = <Foo*>&foo_ct
のCannot take address of Python variable
またはassigning to 'PyObject *' (aka '_object *') from incompatible type 'void'
のいずれかを作成して返しません。
今後の予定はありますか?
foo_ct'は 'Foo_ct'構造体のアドレスである'ので、あなたはこの 'バー(size_tのfoo_ct)を行うことができます。 cy_use_struct ( foo_ct) 'です。つまり、CオブジェクトのアドレスをPythonで取得し、Cオブジェクトのcythonでキャストします。 –
oz1
これは良いアイデアですが、これは私にセグメンテーションフォルトを与えます.. – toine
私は現在これをテストすることができませんので、私はコメント:私はアドレスを取得する 'ctypes.addressof(foo_ct)'を行うと思います。それをCythonの整数にキャストしてからポインタにキャストします。 (私はかなり2ステップのキャストが必要だと確信している) – DavidW