如何使用Python';传递指向C函数的指针;什么是CFFI?

如何使用Python';传递指向C函数的指针;什么是CFFI?,python,python-cffi,Python,Python Cffi,如何使用Python的CFFI传递指向C函数的指针 例如,如果我正在包装的库有两个函数: void some_function(void (*callback)()) { callback(); } void some_callback() { printf("callback!\n"); } 如何调用some\u函数传入some\u回调?例如,类似于: from mylib._ffi import lib lib.some_function(lib.some_callbac

如何使用Python的CFFI传递指向C函数的指针

例如,如果我正在包装的库有两个函数:

void some_function(void (*callback)()) {
    callback();
}

void some_callback() {
    printf("callback!\n");
}
如何调用
some\u函数
传入
some\u回调
?例如,类似于:

from mylib._ffi import lib
lib.some_function(lib.some_callback)

我知道我可以使用
ffi.callback(…)
在回调中包装Python函数,但我想知道是否可以避免重复C函数的类型签名和其他内容。

对于最新版本的cffi,在离线模式下,您可以执行以下操作:

lib.some_function(ffi.addressof(lib, "some_callback"))
或者,这也适用于较旧的cffi,您需要调整cdef,将“some_callback”作为常量函数指针而不是函数:

ffi.cdef("void (*const some_callback)();")
lib.some_function(lib.some_callback)
如果这看起来太神奇,那么更详细但更清晰的解决方案是:

ffi.cdef("""
    typedef void (*my_callback_t)();
    my_callback_t get_some_callback(void);
""")
ffi.set_source("example",  # <- or, ffi.verify(
"""
    // declare get_some_callback() explicitly here:
    typedef void (*my_callback_t)();
    static my_callback_t get_some_callback(void) {
        return &some_callback;
    }
""")

some_callback = lib.get_some_callback()
lib.some_function(some_callback)
ffi.cdef(“”)
typedef void(*my_t)();
我的回拨无法得到一些回拨(无效);
""")
ffi.set_来源(“示例”#