如何从c++;,将其传递给Python并检索回C++; 我需要共享一个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++数组 af::array pyObjectToArray(PyObject* obj) { af::array tmp; PyObject* arr = PyObject_GetAttr(obj, PyUnicode_FromString("arr")); if (arr) { af_array ref = (af_array)(PyLong_AsVoidPtr(arr)); if (ref) { tmp.set(ref); } } return tmp; }

如何从c++;,将其传递给Python并检索回C++; 我需要共享一个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++数组 af::array pyObjectToArray(PyObject* obj) { af::array tmp; PyObject* arr = PyObject_GetAttr(obj, PyUnicode_FromString("arr")); if (arr) { af_array ref = (af_array)(PyLong_AsVoidPtr(arr)); if (ref) { tmp.set(ref); } } return tmp; },python,c++,arrayfire,Python,C++,Arrayfire,这里的问题是PyLong_AsVoidPtr失败,类为“TypeError”:需要一个整数 (16.16.1.4.基本数据类型)表示c_void_p的Python类型为int或None。显然,我的情况不是这样 如何使用c API将c_void_p转换为python 谢谢 我解决了 ctypes类型对象的值可以从值属性中读取 af::array pyObjectToArray(PyObject* obj) { af::array tmp; PyObject* arr = PyObj

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

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

如何使用c API将c_void_p转换为python

谢谢

我解决了

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;
}
af::数组pyObjectToArray(PyObject*obj)
{
阵列tmp;

PyObject*arr=PyObject\u GetAttr(obj,PyUnicode\u FromString(“arr”));//奇怪。你为什么不使用arrayfire的Python包装器?我正在使用它。但是,如果你需要将应用程序中创建的af::数组共享给arrayfire Python绑定类型数组,那么你就需要这个技巧。传递af_数组引用的好处是,如果你使用的是CUDA后端,内存将保留在GPU an中d复制数据不会增加开销。