繁体   English   中英

如何在Python中实现一个C接口并使用CFFI传递对象

[英]How to implement a C interface in Python and pass objects using CFFI

我想知道如何使用现有的 C 接口(header 文件)并通过使用 CFFI 库在 Python 中实现这样的接口。

例如,我有以下 header 文件interface.h

void* foo(void* value);

我想在 Python 中实现它。 我认为以下程序可以完成工作,但事实并非如此。 它创建 function foo ,但不保证实现遵循 header 文件中定义的结构。

import cffi

ffibuilder = cffi.FFI()

with open('interface.h') as f:
    data = ''.join([line for line in f if not line.startswith('#')])
    ffibuilder.embedding_api(data)

ffibuilder.set_source("_lib", r'''
    #include "interface.h"
''')

ffibuilder.embedding_init_code("""
    from _lib import ffi

     #include "interface.h"

    @ffi.def_extern()
    def foo(param):
        return __import__(param)

""")

ffibuilder.compile(verbose=True)

如何使用 CFFI 传递 Python 对象?

在上面的例子中,作为调用foo的结果,返回 Python object。 然后在客户端,我有以下内容:

ffi = FFI()
# Load my lib file
lib = C.CDLL(dll)

h = lib.foo("math")

当我查看 h 的值时,它显示了一个类型为 integer 的数字。 但是,我期待收到 object。 根据接口, foo必须返回一个指针void* 我如何从中读取 object ? 难道我做错了什么?

要回答您的最后一个问题:在此示例中,您使用的是ctypes ,而不是cffi 这些是不同的项目。 这应该很明显,因为ffi object 来自cffi ,但在以下行中未使用。 而不是lib = C.CDLL()我猜Cctypes的别名,你应该调用lib = ffi.dlopen("...")

我发现问题在于从 ctypes 切换到 CFFI 以加载 DLL 时。 第一个需要定义动态库中可用的方法。 因此,添加这个可以解决问题

ffi.cdef("""
  void foo(void* value);
""")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM