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

时间:2019-01-21 06:52:35

标签: python c ctypes

我目前正在尝试通过编写C函数来对非常大的数组进行繁重的工作来减少Python程序的运行时间。目前,我只是使用这个简单的功能。

simple1

我想让我的python代码执行的所有工作就是调用C函数,然后返回新数组。这是我到目前为止的内容:

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

我的问题:究竟如何从返回的指针创建python列表?! 我已经把它弄乱了好多年了。我想要一个最简单的解决方案,因为我不是一个非常有经验的程序员。 在此先感谢!

1 个答案:

答案 0 :(得分: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