如何使用ctypes将Python列表转换为C数组?

时间:2010-11-10 14:58:14

标签: python c ctypes

如果我有以下两组代码,我该如何将它们粘合在一起?

void
c_function(void *ptr) {
    int i;

    for (i = 0; i < 10; i++) {
        printf("%p", ptr[i]);
    }

    return;
}


def python_routine(y):
    x = []
    for e in y:
        x.append(e)

如何在x中使用连续的元素列表调用c_function?我试图将x转换为c_void_p,但这不起作用。

我也尝试使用像

这样的东西
x = c_void_p * 10 
for e in y:
    x[i] = e

但这会出现语法错误。

C代码显然需要数组的地址。我如何实现这一目标?

4 个答案:

答案 0 :(得分:70)

以下代码适用于任意列表:

import ctypes
pyarr = [1, 2, 3, 4]
arr = (ctypes.c_int * len(pyarr))(*pyarr)

答案 1 :(得分:8)

来自the ctypes tutorial

>>> IntArray5 = c_int * 5
>>> ia = IntArray5(5, 1, 7, 33, 99)

答案 2 :(得分:6)

这是对已接受答案的解释。

ctypes.c_int * len(pyarr)创建长度为4(python3python 2)的类型c_int的数组(序列)。由于c_int是一个其构造函数使用一个参数的对象,因此(ctypes.c_int * len(pyarr)(*pyarr)c_int中每个pyarr实例进行一次初始化。 easier to read表单是:

pyarr = [1, 2, 3, 4]
seq = ctypes.c_int * len(pyarr)
arr = seq(*pyarr)

使用type函数查看seqarr之间的区别。

答案 3 :(得分:1)

import ctypes
import typing

def foo(aqs : typing.List[int]) -> ctypes.Array:
    array_type = ctypes.c_int64 * len(aqs)
    ans = array_type(*aqs)
    return ans

for el in foo([1,2,3]):
    print(el)

这将给出:

1
2
3