嵌入 Python 时共享数组的最简单方法

Simplest way to share an array when embedding Python

本文关键字:最简单 方法 数组 共享 Python 嵌入      更新时间:2023-10-16

我正在用C++编写一个模拟,并决定通过将一些数组的初始化嵌入到我的应用程序中来将一些数组的初始化委托给 Python,并使用一些 Python 函数来生成初始数据。

由于我的 2D/3D 数组是由C++部分分配和管理的,我需要将它们传递给 Python。最好的方法可能是缓冲协议。我可以在C++中编写一个 Python 类,它实现了缓冲区协议并为我在C++中的存储创建一个缓冲区对象。

现在,我想避免过度设计此过程。事实上,我只需要传递一个指针,一个大小和步幅的元组到一个Python函数。

因此,问题是:将此信息传递给 Python 例程的最简单方法是什么,然后它可以使用它(可能与 Numpy 一起使用(来初始化指向存储?

举个我需要做什么的例子,我想从C++调用的 Python 函数是:

def init_field(field, X, Y):
    field[:, :] = np.sqrt(X) + np.tanh(Y)

其中XY是由Python创建并由C++应用程序借用的numpy数组,field正是这个由C++管理的2D数组。我当然可以用一个或多个参数替换field,其中包含有关指针、大小和步幅的信息,并构造 numpy 数组。我该怎么做?

不太

难的是使用PyArray_SimpleNewFromData。使用它可能会导致代码如下:

void use_array(float* ptr, int width, int height)
{
    PyObject *pFunc = pyFunction("python_function_name");
    if (pFunc == 0)
        return;
    PyObject *pArgs = PyTuple_New(1);
    npy_intp dims[2];
    dims[1] = width;
    dims[0] = height;
    PyTuple_SetItem(pArgs, 0, PyArray_SimpleNewFromData(2, dims, NPY_FLOAT, ptr));
    PyObject *pValue = PyObject_CallObject(pFunc, pArgs);
    Py_DECREF(pArgs);
    if (pValue != NULL) {
        Py_DECREF(pValue);
    }
    else 
    {
        PyErr_Print();
        fprintf(stderr,"Call failedn");
        return;
    }
    Py_DECREF(pFunc);
}

设置嵌入式 Python 环境时,应按照 http://docs.scipy.org/doc/numpy-1.10.0/reference/c-api.array.html#miscellaneous 中所述调用import_array()