C++嵌入Python场景下自定义Python对象的传递处理疑问
C++调用嵌入Python中的PyTorch设备对象问题
我正在尝试掌握在C应用中使用嵌入式Python的方法,具体来说是想用C调用PyTorch代码。我编写了一个Python初始化函数用于执行设备(CPU或GPU)检测,并希望将检测得到的设备对象返回给C代码。之后C会调用另一个Python推理函数,此时需要将该设备对象传递回Python。
现有代码中卡在了如何把获取到的设备对象pValue_device打包成参数传给推理函数,下面是具体的解决方法:
其实你不用纠结这是PyTorch的device对象还是自定义Python对象——在CPython的C API层面,所有Python对象都统一用PyObject*表示,处理逻辑和普通Python对象完全一致。你只需要把这个对象打包成Python函数能接收的参数容器(通常是元组),再传给推理函数即可。
修改TODO处的代码如下:
// 创建一个仅包含1个元素的参数元组,用来存放设备对象 pArgs_device = PyTuple_New(1); if (!pArgs_device) { // 处理内存分配失败的异常情况 Py_DECREF(pFunc_infer); Py_DECREF(pValue_device); Py_DECREF(pFunc_init); Py_DECREF(pModule); PyErr_Print(); fprintf(stderr, "Failed to create argument tuple\n"); return 1; } // 将设备对象放入元组的第0个位置 // 注意:PyTuple_SetItem会自动接管传入的PyObject的引用,所以这里不需要额外调用Py_DECREF(pValue_device) int set_item_status = PyTuple_SetItem(pArgs_device, 0, pValue_device); if (set_item_status != 0) { // 处理设置元组元素失败的情况 Py_DECREF(pArgs_device); Py_DECREF(pFunc_infer); Py_DECREF(pValue_device); Py_DECREF(pFunc_init); Py_DECREF(pModule); PyErr_Print(); fprintf(stderr, "Failed to add device object to argument tuple\n"); return 1; }
额外的清理工作
调用完推理函数后,别忘了清理参数元组的引用:
if (pValue_infer != NULL) { printf("Result pValue_infer: %ld\n", PyLong_AsLong(pValue_infer)); Py_DECREF(pValue_infer); } // 释放参数元组的引用 Py_DECREF(pArgs_device);
内容的提问来源于stack exchange,提问作者PJD
相关产品推荐
相关产品推荐

