如何将Python数组传入C函数并获取返回数组并打印?
Python调用C卷积函数:数组传递与返回值处理
问题场景
编写了C卷积函数并编译为convolution.so,但Python调用时无法传入数组,且不知道如何处理返回的数组指针。原Python代码调用时报错:
ctypes.ArgumentError: argument 1: <class 'TypeError'>: Don't know how to convert parameter 1
一、将Python数组传入C函数
ctypes无法直接将Python列表转换为C的数组指针,需要显式转换为C兼容的数组类型,并为C函数声明参数类型:
修改后的Python参数处理代码
from ctypes import * so_file = "./convolution.so" convolution_lib = CDLL(so_file) # 声明C函数的参数类型:两个int指针、一个int convolution_lib.convolution.argtypes = [POINTER(c_int), POINTER(c_int), c_int] # 声明返回类型:int指针 convolution_lib.convolution.restype = POINTER(c_int) a = [1, 3, 5, 6] b = [3, 5, 6, 7] input_size = 4 # 将Python列表转为C风格int数组 c_a = (c_int * input_size)(*a) c_b = (c_int * input_size)(*b)
关键说明
(c_int * input_size)(*a)会创建与C语言int[]兼容的数组对象,内存布局和C数组完全一致- 通过
argtypes和restype声明函数类型,让ctypes自动处理类型转换,避免参数不匹配错误
二、处理返回的数组指针并打印
先修复C函数的致命问题
原C函数返回了栈上的局部数组resArr,函数返回后栈内存会被系统回收,返回的指针是野指针,访问会导致崩溃、乱码等未定义行为。必须改用堆内存分配(malloc):
修改后的C函数
#include <stdio.h> #include <stdlib.h> // 引入malloc/free的头文件 int * convolution(int a[], int b[], int inputArraySize) { int resArrayLength = inputArraySize*2-1; // 在堆上分配内存,函数返回后不会被释放 int *resArr = (int *)malloc(resArrayLength * sizeof(int)); if (resArr == NULL) { return NULL; // 处理内存分配失败的情况 } // 原有的卷积计算逻辑保持不变... return resArr; }
Python中访问返回数组并打印
拿到返回指针后,根据结果数组长度(input_size*2-1)遍历指针指向的内存,最后必须释放C端分配的堆内存避免泄漏:
完整Python调用代码
from ctypes import * so_file = "./convolution.so" convolution_lib = CDLL(so_file) # 声明函数类型 convolution_lib.convolution.argtypes = [POINTER(c_int), POINTER(c_int), c_int] convolution_lib.convolution.restype = POINTER(c_int) a = [1, 3, 5, 6] b = [3, 5, 6, 7] input_size = 4 # 转换数组类型 c_a = (c_int * input_size)(*a) c_b = (c_int * input_size)(*b) # 调用C函数 result_ptr = convolution_lib.convolution(c_a, c_b, input_size) result_length = input_size * 2 - 1 # 打印结果数组 print("卷积结果:") for i in range(result_length): print(result_ptr[i], end=" ") print() # 释放C端分配的堆内存 free_func = convolution_lib.free free_func.argtypes = [c_void_p] free_func(result_ptr)
内容的提问来源于stack exchange,提问作者godvlpr
相关产品推荐
相关产品推荐

