いくつかの cffi 定義がいくつかのプロジェクト サブディレクトリに分散しています。各 cffi ファイルは型と関数を定義し、それぞれ_<package>.py
が読み込まれるファイルにコンパイルされます。最終的なアプリケーションではffi.include()
、トップ レベルのもの (再帰的ffi.include()
に下位レベルのもの) を生成 _<app>.py
し、アプリケーションにロードするコンパイル ファイルを生成します。ffi
ファイルのロードには単一のインスタンスを使用し*.so
ます。_<package>.py
ただし、これがスプレッドファイルをアプリケーションにロードする方法がわかりません。次のエラーが表示されます (例):
2 つの別個の FFI 定義ファイル、
root/get/ffi_getA.py
およびroot/use/ffi_useA.py
どちらの C 関数も同じライブラリの一部ですlibA.so
。
ffi_getA.py
:
from cffi import FFI
ffi=FFI()
ffi.set_source("getA",None)
ffi.cdef('''
typedef ... A; // type also used in another ffi definition.
const A* get_A();
''')
ffi_useA.py
:
from cffi import FFI
ffi=FFI()
ffi.set_source("useA",None)
from root.get import ffi_getA
ffi.include(ffi_getA.ffi) # makes available type A
ffi.cdef('''
const void* use_A(const A*); // use type A
''')
アプリケーションで:
from root.get import getA # compiled ffi
from root.use import useA # compiled ffi
libAget = getA.ffi.dlopen("libA.so")
libAuse = useA.ffi.dlopen("libA.so")
a = libAget.getA()
libAuse.useA(a) # !!! mixing !!!, a is indeed of type A ...
# ... but from a different ffi instance.
この混合はうまくいかないので、問題は次のとおりです。
共通/単一のffiオブジェクトを介して、コンパイルされたさまざまなffiオブジェクトにまたがるcdef関数にアクセス/ロードする方法は?