【问题标题】:How do I pass a pointer to a C function with Python's CFFI?如何使用 Python 的 CFFI 将指针传递给 C 函数?
【发布时间】:2015-08-28 19:58:34
【问题描述】:

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

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

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

void some_callback() {
    printf("callback!\n");
}

如何调用some_function 传入some_callback?例如,类似:

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

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

【问题讨论】:

    标签: python python-cffi


    【解决方案1】:

    使用最新版本的 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)
    

    【讨论】:

      猜你喜欢
      • 2018-01-21
      • 2020-09-14
      • 2011-05-19
      • 1970-01-01
      • 2021-02-04
      • 2012-02-22
      • 1970-01-01
      • 2016-09-15
      • 1970-01-01
      相关资源
      最近更新 更多