如何将二维数组从 C 传递到 Python

How to Pass Two-dimensional array from C to Python

本文关键字:Python 二维数组      更新时间:2023-10-16

我想将二维数组从C传递给python。

如何使用Py_BuildValue()PyEval_CallObject()

例如,我可以使用以下代码将字符串从 C 传递给 python:

pModule = PyImport_ImportModule("python_code");
pFunc = PyObject_GetAttrString(pModule, "main");
pParam = Py_BuildValue("(s)", "HEHEHE");
pResult = PyEval_CallObject(pFunc,pParam);

现在,我想将二维数组和一个字符串传递给python

所以基本上,你想要构建一个元组,而不是解析一个元组。

这只是如何将arr转换为元组元组的简单示例。在这里,您还应该在某个时间点添加一些错误检查。

Py_ssize_t len = arr.size();
PyObject *result = PyTuple_New(len);
for (Py_ssize_t i = 0; i < len; i++) {
    Py_ssize_t len = arr[i].size();
    PyObject *item = PyTuple_New(len);
    for (Py_ssize_t j = 0; j < len; j++)
        PyTuple_SET_ITEM(item, j, PyInt_FromLong(arr[i][j]));
    PyTuple_SET_ITEM(result, i, item);
}

(对于 Python 3 C API,请将 PyInt_FromLong(arr[i][j]) 替换为 PyLong_FromLong(arr[i][j]) (

然后你可以构建你的参数,就像你对字符串所做的那样。您可以使用 O 表示 PyObject *,而不是 s 表示字符串(如果您不想增加引用计数,则使用 N(:

pParam = Py_BuildValue("(O)", result);

也许 boost::p ython 可以提供更简单的方法,但我自己并不了解库。

第二个循环需要从以下位置进行子磁贴更改:

for (Py_ssize_t j = 0; i < len; j++)

for (Py_ssize_t j = 0; j < len; j++)

使用正确的运行条件语句。