Python C 绑定 - 从 python 获取数组到 C++
Python C binding - get array from python to C++
正如标题所说:我想在 C++ 中创建一个 python 绑定,对某个数组执行一些代数运算。为此,我必须将 python "array object" 解析为 C++ 作为双精度或整数向量或任何情况。
我试图这样做,但我遇到了一些问题。我创建了一个新的 python 类型和一个名为 Typer
的 class ,我有这个方法试图获取 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 数组object 解析为C 数组(使用malloc 分配数组的内存)。然后我将 object 中的每个元素添加到我的 C 数组中,然后只计算最后一个 for-loop.
中的总和
如果我构建项目然后创建一个 python 测试文件,什么也不会发生(文件编译没有任何问题但它没有打印任何东西)。
y = example.Typer() . #typer is the init
tuple = (1, 2, 3)
print(y.vectorsum(tuple))
我错过了什么吗?而且,是否有一种简单易行的方法可以将 python 数组 object 转换为 C++,但作为 std::vector 而不是 classic C 数组?
提前致谢!
该元组包含整数,而不是浮点数,因此您的 PyFloat_Check
失败了。不,没有从 Python 元组到 C 数组或 C++ std::vector
的直接方法。原因是元组是 Python 对象的数组,而不是 C 值的数组,例如 double
s.
这是改进了错误检查的示例,之后它应该可以工作:
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;
正如标题所说:我想在 C++ 中创建一个 python 绑定,对某个数组执行一些代数运算。为此,我必须将 python "array object" 解析为 C++ 作为双精度或整数向量或任何情况。
我试图这样做,但我遇到了一些问题。我创建了一个新的 python 类型和一个名为 Typer
的 class ,我有这个方法试图获取 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 数组object 解析为C 数组(使用malloc 分配数组的内存)。然后我将 object 中的每个元素添加到我的 C 数组中,然后只计算最后一个 for-loop.
中的总和如果我构建项目然后创建一个 python 测试文件,什么也不会发生(文件编译没有任何问题但它没有打印任何东西)。
y = example.Typer() . #typer is the init
tuple = (1, 2, 3)
print(y.vectorsum(tuple))
我错过了什么吗?而且,是否有一种简单易行的方法可以将 python 数组 object 转换为 C++,但作为 std::vector 而不是 classic C 数组?
提前致谢!
该元组包含整数,而不是浮点数,因此您的 PyFloat_Check
失败了。不,没有从 Python 元组到 C 数组或 C++ std::vector
的直接方法。原因是元组是 Python 对象的数组,而不是 C 值的数组,例如 double
s.
这是改进了错误检查的示例,之后它应该可以工作:
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;