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

No *_*lar 41 c python 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)
Run Code Online (Sandbox Code Playgroud)

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

我也试过用类似的东西

x = c_void_p * 10 
for e in y:
    x[i] = e
Run Code Online (Sandbox Code Playgroud)

但是这会出现语法错误.

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

Gab*_*aru 76

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

import ctypes
pyarr = [1, 2, 3, 4]
arr = (ctypes.c_int * len(pyarr))(*pyarr)
Run Code Online (Sandbox Code Playgroud)

  • @AaronYC我很抱歉这个混乱; `pyarr`是一个普通的python列表,比如`pyar = [1,2,3,4]`.如果你想知道这个名字之前的明星,请查看:http://stackoverflow.com/questions/400739/what-does-mean-in-python (4认同)
  • 很好的答案,但对我们未洗过的有点油腻. (3认同)
  • 很好,现在如何释放那个 `arr` 变量?当然,我们不必在这里使用 C 中的 `free()`,对吗? (2认同)

Rya*_*rom 9

ctypes教程:

>>> IntArray5 = c_int * 5
>>> ia = IntArray5(5, 1, 7, 33, 99)
Run Code Online (Sandbox Code Playgroud)

  • 适用于超过255项:`IntArray300 = c_int*300; arrayWith300Elements = IntArray300(*list([i for i in range(300)])) (3认同)

akh*_*han 9

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

ctypes.c_int * len(pyarr)创建一个c_int长度为4 的数组(序列)(python3,python 2).由于c_int是一个对象,其构造函数采用一个参数,因此(ctypes.c_int * len(pyarr)(*pyarr)每个c_int实例的一次性初始化pyarr.一个易于阅读的形式是:

pyarr = [1, 2, 3, 4]
seq = ctypes.c_int * len(pyarr)
arr = seq(*pyarr)
Run Code Online (Sandbox Code Playgroud)

使用type功能看之间的区别seqarr.