Python C绑定-从python到C ++获取数组

问题描述 投票:0回答:1

正如标题所说:我很想在C ++中建立一个python绑定,该绑定在某些数组上执行代数运算。为此,我必须将python“数组对象”解析为C的double或integer或任何情况的向量。我尝试这样做,但是遇到一些问题。我创建了一个新的python类型和一个名称为Typer的类,在该类中,我有此方法尝试获取python数组的元素,然后计算总和(作为第一步)。

tatic PyObject *Typer_vectorsum(Typer *self, PyObject *args)
{
    PyObject *retval;
    PyObject *list;

    if (!PyArg_ParseTuple(args, "O", &list))
        return NULL;
    double *arr;
    arr = (double *)malloc(sizeof(double) * PyTuple_Size(list));
    int length;
    length = PyTuple_Size(list);
    PyObject *item = NULL;
    for (int i = 0; i < length; ++i)
    {
        item = PyTuple_GetItem(list, i);
        if (!PyFloat_Check(item))
        {
            exit(1);
        }
        arr[i] = PyFloat_AsDouble(item);
    }
    double result = 0.0;
    for (int i = 0; i < length; ++i)
    {
        result += arr[i];
    }
    retval = PyFloat_FromDouble(result);
    free(arr);
    return retval;
}

在此方法中,我将python数组对象解析为C数组(使用malloc分配数组的内存)。然后,将对象中的每个元素添加到我的C数组中,然后在最后一个for循环中计算总和。

如果我先构建项目,然后创建一个python测试文件,则什么也没有发生(文件编译没有任何问题,但它没有打印任何内容。

y = example.Typer() .  #typer is the init
tuple = (1, 2, 3)
print(y.vectorsum(tuple))

我想念什么吗?而且,是否有一种很好的,简便的方法将python数组对象放入C ++中,但作为std :: vector而不是经典的C数组?

谢谢您!

正如标题所说:我很想在C ++中建立一个python绑定,该绑定在某些数组上执行代数运算。为此,我必须将python“数组对象”解析为C的double或...向量。]]

python c++ cpython
1个回答
0
投票

元组包含整数,而不是浮点数,因此您的PyFloat_Check失败。不,从Python元组到C数组或C ++ std::vector没有直接方法。原因是该元组是Python对象数组,而不是C值数组,例如double s。

这是您的示例,具有改进的错误检查,此后它应该可以工作:

© www.soinside.com 2019 - 2024. All rights reserved.