You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:42:12