【发布时间】:2021-06-06 08:11:32
【问题描述】:
我想知道如何使用现有的 C 接口(头文件)并使用 CFFI 库在 Python 中实现这样的接口。
例如我有如下头文件,interface.h:
void* foo(void* value);
我想在 Python 中实现它。我认为下面的程序可以完成这项工作,但事实并非如此。它创建函数foo,但不保证实现遵循头文件中定义的结构。
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 对象。
然后在客户端,我有以下内容:
ffi = FFI()
# Load my lib file
lib = C.CDLL(dll)
h = lib.foo("math")
当我查找 h 的值时,它显示了一个整数类型的数字。但是,我期待收到一个对象。根据接口,foo必须返回一个指针void*。我怎样才能从中读取该对象?我做错了吗?
【问题讨论】:
-
这对我来说是正确的。你到底在问什么?你能举一个你所说的失败的例子吗?
-
例如,如果我将方法
foo的实现更改为接收两个参数而不是一个。它仍然有效(我认为它不应该因为它与头文件的规范不匹配)。 -
“它仍然有效”,因为您可以运行上述脚本并编译 .so/.dll 文件,是的。就像如果函数在变量名中包含拼写错误一样,您可以编译它。它可以编译,但在运行时失败。如果这就是您所关心的,那么首先使用 Python 可能不是正确的选择...
-
你是对的,@ArminRigo!谢谢!
标签: python c python-cffi cffi