Python3 cffi:有没有办法将两个独立的 ffi 合并为一个?
Python3 cffi: is there a way to merge two independent ffi's into one?
假设我有两个需要协同工作的库。一个库有一个函数接受另一个库中内置的类型。
进一步假设我为两个库中的每一个都创建了两个独立的 FFI 接口。
现在,我让每个单独的库都能正常工作,但是当我将一个 ffi 中内置的 object 类型传递给另一个 ffi 时,出现以下错误:
TypeError: initializer for ctype 'Foo *' appears indeed to be 'Foo *', but the types are different (check that you are not e.g. mixing up different ffi instances)
我试图避免的是将这两个库集成为一个 header 和一个完全集成的 class。这是因为 class 将是 one-off 并且方法的组合将是随机的、详细的、具体的、过度专业化的:即,难以命名并记住以后使用。
有什么方法可以合并两个 ffi 以便它们一起工作吗?
或者,例如,执行某种从一种 ffi's
类型到另一种类型的转换操作?库后端将正常工作...
(我试过通过 second_ffi.cast('Foo *',first_ffi_foo)
进行转换,但似乎需要更多手动操作,例如将第一个 ffi 中的字节复制到第二个 ffi 中)
我最终通过将 cffi.FFI
实例的范围与我将 C-header 划分到的 classes 的范围分开来解决了这个问题。
通过在 class 声明中接受 cffi.FFI()
选项,我能够将库接口混合在一起:
class LibFoo:
def __init__(self, ffi_option: Optional[FFI], ...):
if ffi_option is None:
self.ffi = FFI()
self.__ownFFI = True
else:
self.ffi = ffi
self.__ownFFI = False
def __del__(self):
if self.__ownFFI:
# close down the ffi
组成:
class ManyLibs(LibFoo, LibBar):
def __init__(self):
self.ffi = FFI()
LibFoo.__init__(self,self.ffi)
LibBar.__init__(self.self.ffi)
假设我有两个需要协同工作的库。一个库有一个函数接受另一个库中内置的类型。
进一步假设我为两个库中的每一个都创建了两个独立的 FFI 接口。
现在,我让每个单独的库都能正常工作,但是当我将一个 ffi 中内置的 object 类型传递给另一个 ffi 时,出现以下错误:
TypeError: initializer for ctype 'Foo *' appears indeed to be 'Foo *', but the types are different (check that you are not e.g. mixing up different ffi instances)
我试图避免的是将这两个库集成为一个 header 和一个完全集成的 class。这是因为 class 将是 one-off 并且方法的组合将是随机的、详细的、具体的、过度专业化的:即,难以命名并记住以后使用。
有什么方法可以合并两个 ffi 以便它们一起工作吗?
或者,例如,执行某种从一种 ffi's
类型到另一种类型的转换操作?库后端将正常工作...
(我试过通过 second_ffi.cast('Foo *',first_ffi_foo)
进行转换,但似乎需要更多手动操作,例如将第一个 ffi 中的字节复制到第二个 ffi 中)
我最终通过将 cffi.FFI
实例的范围与我将 C-header 划分到的 classes 的范围分开来解决了这个问题。
通过在 class 声明中接受 cffi.FFI()
选项,我能够将库接口混合在一起:
class LibFoo:
def __init__(self, ffi_option: Optional[FFI], ...):
if ffi_option is None:
self.ffi = FFI()
self.__ownFFI = True
else:
self.ffi = ffi
self.__ownFFI = False
def __del__(self):
if self.__ownFFI:
# close down the ffi
组成:
class ManyLibs(LibFoo, LibBar):
def __init__(self):
self.ffi = FFI()
LibFoo.__init__(self,self.ffi)
LibBar.__init__(self.self.ffi)