使用 CFFI 从 Python 传递指向 C 函数的指针的最佳方法

Posted

技术标签:

【中文标题】使用 CFFI 从 Python 传递指向 C 函数的指针的最佳方法【英文标题】:Best way to pass pointer to C function from Python using CFFI 【发布时间】:2018-01-21 06:03:28 【问题描述】:

我想为第三方库中的 C 函数创建一个 Python 包装器,该库具有诸如

之类的签名
int f(double* x);

函数f 修改输入参数x(即,使用指针通过引用调用)。实现 Python 包装函数的最有效方法是什么,以便 Python 用户可以将其视为每次只返回一个新数字的函数?示例伪代码:

# lib and ffi are imported from a compiled cffi.FFI() object
def python_f():
    ??? double x; ???
    rc = lib.f(&x)
    assert rc == 0
    return x

我应该使用数组模块吗(例如,创建一个大小为 1 的“双”数组,将其传递给函数,然后返回第一个索引)?有没有更轻量级的方法使用 ctypes 或 cffi 辅助函数?

【问题讨论】:

【参考方案1】:
def python_f():
    x_ptr = ffi.new("double[1]")
    x_ptr[0] = old_value
    rc = lib.f(x_ptr)
    assert rc == 0
    return x_ptr[0]

【讨论】:

以上是关于使用 CFFI 从 Python 传递指向 C 函数的指针的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Numba 中使用指针包装 CFFI 函数

在 Python CFFI 中声明包含 time_t 字段的结构

Python cffi学习

如何使用 cffi 在 C 中嵌入一个返回字符串的 Python 函数?

如何使用 Python CFFI 正确包装 C 库

如何使用 CFFI 将包含其标头的 C 库包装到 python 程序中?