You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:56:30