【问题标题】:Python C binding - get array from python to C++Python C 绑定 - 从 python 获取数组到 C++
【发布时间】:2020-04-24 08:20:12
【问题描述】:

正如标题所说:我想在 C++ 中创建一个 python 绑定,对某个数组执行一些代数运算。为此,我必须将 python“数组对象”解析为 C++ 作为双精度或整数向量或任何情况。 我试图这样做,但我面临一些问题。我创建了一个新的 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 数组?

提前谢谢你!

【问题讨论】:

标签: python c++ cpython


【解决方案1】:

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

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

PyObject *retval;
PyObject *list;

if (!PyArg_ParseTuple(args, "O!", &PyTuple_Type, &list))
    return NULL;

double *arr = 
arr = (double *)malloc(sizeof(double) * PyTuple_GET_SIZE(list));
int length;
length = PyTuple_GET_SIZE(list);
PyObject *item = NULL;
for (int i = 0; i < length; ++i)
{   
    item = PyTuple_GET_ITEM(list, i);
    arr[i] = PyFloat_AsDouble(item);
    if (arr[i] == -1. && PyErr_Occurred())
    {   
        exit(1);
    }
}
double result = 0.0;
for (int i = 0; i < length; ++i)
{
    result += arr[i];
}
retval = PyFloat_FromDouble(result);
free(arr);
return retval;

【讨论】:

    猜你喜欢
    • 2013-08-17
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多