我需要在C ++中共享一个用Python创建的ArrayFire数组。这没关系:
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脚本返回一个ArrayFire数组,我需要读取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;
}
这里的问题是PyLong_AsVoidPtr失败了,类' TypeError':需要一个整数。
@InjectMocks Ref(16.16.1.4。基本数据类型)表示c_void_p的Python类型是int或None。显然在我的情况下它是无
如何使用C API将c_void_p转换为python?
谢谢!
答案 0 :(得分:2)
我解决了。
可以从值属性中读取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;
}