我有一些 cffi 定义分布在几个项目子目录中——每个 cffi 文件定义类型和函数,每个都编译成一个_<package>.py
要加载的文件。在最终的应用程序中,我ffi.include()
在顶层(递归地ffi.include()
为较低级别的)并生成一个编译 _<app>.py
文件以加载到应用程序中。我使用单个ffi
实例来加载*.so
文件。但是,我看不到这是如何将扩展_<package>.py
文件加载到应用程序中的。我收到以下错误(示例):
两个单独的 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 函数?