使用ctypes将C数组从C函数返回给Python

3

我目前正在尝试通过编写C函数来处理非常大的数组,以减少Python程序的运行时间。目前我只是使用这个简单的函数。

int * addOne(int array[4])
{
    int i;
    for(i = 0; i < 5; i++)
    {
        array[i] = array[i] + 1;
    }
    return array;
}

我希望我的Python代码仅仅调用C函数,并返回新的数组。以下是我的代码:

from ctypes import *
libCalc = CDLL("libcalci.so")
pyarr = [65, 66, 67, 68]
arr = (ctypes.c_int * len(pyarr))(*pyarr)
res = libCalc.addOne(arr)

如何从返回的指针创建Python列表?

这个问题已经有了一个很好的答案,但是这里有一个替代选项:如果你想快速处理大量的数值数据数组,而不是编写自己的C扩展,你可以使用numpy。这正是numpy的用途,它可以非常快速地完成。 - zvone
这个回答解决了你的问题吗?Python Ctypes:将返回的C数组转换为Python列表,不使用numpy - mkrieger1
1个回答

3

你返回的指针实际上与你传递的指针相同。也就是说,你实际上不需要返回数组指针。

你将Python中列表的内存区域指针传递给C,C函数可以更改该内存。你可以返回一个整数状态码来标记是否一切都如预期那样进行。不必返回指针。

int addOne(int array[4])
{
    int i;
    for(i = 0; i < 5; i++)
    {
        array[i] = array[i] + 1; //This modifies the underlying memory
    }
    return 0; //Return 0 for OK, 1 for problem.
}

从Python方面来看,您可以通过检查arr来查看结果。

from ctypes import *
libCalc = CDLL("libcalci.so")
pyarr = [65, 66, 67, 68]                   #Create List with underlying memory
arr = (ctypes.c_int * len(pyarr))(*pyarr)  #Create ctypes pointer to underlying memory
res = libCalc.addOne(arr)                  #Hands over pointer to underlying memory

if res==0:
    print(', '.join(arr))                  #Output array

非常感谢!现在它对我有效了。只有一个问题...我如何构建一个二维ctypes数组?干杯,Nick - Nicolas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接