gpt4 book ai didi

python - 如何从 C++ 创建 c_void_p PyObject,将其传递给 Python 并将其检索回 C++

转载 作者:太空狗 更新时间:2023-10-29 21:35:35 25 4
gpt4 key购买 nike

我需要将用 C++ 创建的 ArrayFire 数组共享给 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 脚本返回一个 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”而失败:需要一个整数。

ctypes doc (16.16.1.4. Fundamental data types) 说 c_void_p 的 Python 类型是 int 或 None。显然在我的情况下是 None

如何使用 C API 将 c_void_p 转换为 python?

谢谢!

最佳答案

我解决了。

可以从 value 属性中读取 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;
}

关于python - 如何从 C++ 创建 c_void_p PyObject,将其传递给 Python 并将其检索回 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41999139/

25 4 0