如何从C++创建CyVoIDyp PyObjor,传递给Python并将其检索回C++

2024-09-30 06:11:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要共享一个C++中创建的数组到Python的数组。这很好:

PyObject* arrayToPyObject(const af::array& arr)
{
    // Create arrayfire array and set 
    PyObject* afArray = createObject("arrayfire", "Array");

    PyObject* ctypes_mod = PyImport_ImportModule("ctypes");
    PyObject* c_void_p = PyObject_GetAttrString(ctypes_mod, "c_void_p");
    PyObject* p = PyObject_CallFunction(c_void_p, "O", PyLong_FromVoidPtr(arr.get()));

    if (PyObject_SetAttr(afArray, PyUnicode_FromString("arr"), p) == 0)
    {
        return afArray;
    }
    else
    {
        Py_XDECREF(afArray);
        return nullptr;
    }
}

现在,如果我的Python脚本返回一个ARARIF FARE数组,我需要读取ARR属性并将指针取回并分配给C++数组

^{pr2}$

这里的问题是PyLong_AsVoidPtr失败了类“TypeError”:需要一个整数。在

ctypes doc(16.16.1.4。基本数据类型)表示c_void_p的Python类型为int或None。显然我的情况不是这样

如何使用capi将c_void_p转换为python?在

谢谢!在


Tags: modreturncreate数组ctypesarraypyobjectaf
1条回答
网友
1楼 · 发布于 2024-09-30 06:11:09

我解决了。在

ctypes类型的对象值可以从属性中读取。在

af::array pyObjectToArray(PyObject* obj)
{
    af::array tmp;
    PyObject* arr = PyObject_GetAttr(obj, PyUnicode_FromString("arr")); // <  c_void_p object
    PyObject* p = PyObject_GetAttr(arr, PyUnicode_FromString("value") // <  int value

    if (arr)
    {
        af_array ref = (af_array)(PyLong_AsVoidPtr(p));

        if (ref)
        {
            tmp.set(ref);
        }
    }

    return tmp;
}

相关问题 更多 >

    热门问题