いくつかのプロジェクトサブディレクトリにいくつかのcffi定義が広がっています。それぞれのcffiファイルはタイプと関数を定義し、それぞれがロードされる_<package>.py
ファイルにコンパイルされます。最終的なアプリケーションでは、ffi.include()
トップレベルのもの(これは再帰的にffi.include()
より低いレベルのものです)をコンパイルしてアプリケーションにロードする_<app>.py
ファイルを生成します。 *.so
ファイルをロードするために単一のffi
インスタンスを使用します。私はどのようにこれがアプリケーションにファイル_<package>.py
をロードするのかわかりません。私は次のエラー(例)を取得:ffi.include(...)を含む複数のffi定義
二つの別々のFFIの定義ファイル、Cの関数は両方とも同じライブラリーの一部であり
root/get/ffi_getA.py
とroot/use/ffi_useA.py
を、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関数へのアクセス/ロード方法を教えてください。
cffiが期待しているように見えます。しかし、あなたが見つけた解決策を共有するためにあなたの質問を編集するのではなく、別の答えとして投稿してそれを受け入れるのではなく、私たちがあなたに手伝ってもらうために具体的な例を提示する必要があります(またはcffi :-) –
@stustd 。あなたはもう少しそれを説明する必要があります。 –