如何用CFFI将多个NumPy数组传入使用全局变量的C代码
我来帮你搞定这个问题——要把NumPy数组传给依赖全局变量的C代码,而且不想改动原C逻辑对吧?看下面的完整方案:
解决方案:用CFFI绑定NumPy数组到C全局变量
首先先提个小细节:你原C代码里的循环初始化写错了——for(i==0; i<n; i++)应该改成for(i=0; i<n; i++),不然循环根本不会执行,我已经在下面的代码里修正了这个问题。
1. 完整的CFFI构建代码(保存为mymodule_build.py)
from cffi import FFI ffibuilder = FFI() ffibuilder.set_source( "mymodule", r""" #include <stdio.h> // 保留你原有的全局变量定义 float *x, *y, *z; int n; void some_func(){ int i; // 修正循环初始化的错误 for(i=0; i<n; i++) printf("%f %f %f\n", x[i], y[i], z[i]); } """ ) ffibuilder.cdef( """ // 声明全局变量和函数,让Python能访问它们 extern float *x; extern float *y; extern float *z; extern int n; void some_func(); """ ) if __name__ == "__main__": ffibuilder.compile(verbose=True)
2. Python调用代码(绑定NumPy数组并执行)
import numpy as np from mymodule import ffi, lib # 创建测试用的NumPy数组——必须是float32类型,和C里的float对应 n = 5 x_np = np.random.rand(n).astype(np.float32) y_np = np.random.rand(n).astype(np.float32) z_np = np.random.rand(n).astype(np.float32) # 把NumPy数组的底层内存指针绑定到C的全局变量上 lib.x = ffi.from_buffer(x_np) lib.y = ffi.from_buffer(y_np) lib.z = ffi.from_buffer(z_np) lib.n = n # 调用C函数,此时会打印数组内容 lib.some_func()
关键注意点
- 类型严格匹配:NumPy数组必须是
np.float32类型,和C中的float对应,否则会出现内存错误或数据乱码。 - 数组生命周期:调用C函数期间,NumPy数组不能被Python垃圾回收,所以要确保
x_np、y_np这些变量在函数执行完之前一直存在。 - 全局变量直接访问:通过
lib.x这种形式直接操作C的全局变量,ffi.from_buffer()负责把NumPy的内存缓冲区转换成CFFI能识别的指针。
这样就能完全不用修改你的C代码逻辑,直接把NumPy数组传入并让C代码通过全局变量访问啦。
内容的提问来源于stack exchange,提问作者StevenMurray
相关产品推荐
相关产品推荐

