将Python元组转换为C数组

9 投票
3 回答
5257 浏览
提问于 2025-04-18 18:51

我正在写一个C语言的函数,这个函数需要接收一个Python中的tuple,里面包含一些int整数。

static PyObject* lcs(PyObject* self, PyObject *args) {
    int *data;
    if (!PyArg_ParseTuple(args, "(iii)", &data)) {
        ....
    }
}

我可以处理固定长度的元组(这里是3个元素),但是如果元组的长度不固定,怎么才能把它转换成C语言中的array呢?

import lcs
lcs.lcs((1,2,3,4,5,6)) #<- C should receive it as {1,2,3,4,5,6}

编辑

其实我可以传一个字符串,里面的数字用';'分隔开。比如说'1;2;3;4;5;6',然后在C代码中把它们分开放到数组里。但是我觉得这样做不太合适。

static PyObject* lcs(PyObject* self, PyObject *args) {
    char *data;
    if (!PyArg_ParseTuple(args, "s", &data)) {
        ....
    }
    int *idata;
    //get ints from data(string) and place them in idata(array of ints)
}

3 个回答

-1

我想我找到了一个解决办法:

static PyObject* lcs(PyObject* self, PyObject *args) {
    PyObject *py_tuple;
    int len;
    int *c_array;
    if (!PyArg_ParseTuple(args, "O", &py_tuple)) {
      return NULL;
    }
    len = PyTuple_Size(py_tuple);
    c_array= malloc(len*4);
    while (len--) {
        c_array[len] = (int) PyInt_AsLong(PyTuple_GetItem(py_tuple, len));
        // c_array is our array of ints
    }
}

这个答案是作为对问题的一个编辑发布的,问题是如何将Python元组转换为C数组,由提问者Piotr Dabkowski提出,遵循CC BY-SA 3.0协议。

0

不确定这是不是你想要的,但你可以写一个C语言的函数,它可以接收不定数量的参数,使用va_list和va_start这两个工具。这里有个教程可以参考:http://www.cprogramming.com/tutorial/c/lesson17.html

3

使用 PyArg_VaParse:https://docs.python.org/2/c-api/arg.html#PyArg_VaParse。这个方法可以处理可变数量的参数,适合用在需要接收不定数量输入的场景。

更多信息可以查看这里:http://www.cplusplus.com/reference/cstdarg/va_list/

因为它是一个元组,所以你可以使用元组相关的函数:https://docs.python.org/2/c-api/tuple.html,比如 PyTuple_Size 和 PyTuple_GetItem。

这里有一个使用示例:Python 扩展模块,支持可变数量的参数

如果对你有帮助,请告诉我。

撰写回答