📝 注册Python模块
#include <Python.h>
#include <iostream>

// 示例结构体(C++对象)
struct MyStruct {
    int value;
};

// C++ 从 Python 获取 `void*` 并使用
static PyObject* use_object(PyObject* self, PyObject* args) {
    PyObject* capsule;
    if (!PyArg_ParseTuple(args, "O", &capsule)) {
        return nullptr;
    }

    // 取回 `void*` 并转换回 C++ 指针
    auto* obj = static_cast<MyStruct*>(PyCapsule_GetPointer(capsule, "this"));
    if (!obj) {
        PyErr_SetString(PyExc_RuntimeError, "Invalid capsule!");
        return nullptr;
    }

    std::cout << "Received C++ object with value: " << obj->value << std::endl;
    return PyLong_FromLong(obj->value);
}

// Python 方法表
static PyMethodDef CppMethods[] = {
    {"use_object", use_object, METH_VARARGS, "Use a C++ object from PyCapsule"},
    {nullptr, nullptr, 0, nullptr}
};

// Python 模块定义
static struct PyModuleDef cppModule = {
    PyModuleDef_HEAD_INIT, "cppModule", nullptr, -1, CppMethods
};

// 初始化 Python 模块
PyMODINIT_FUNC PyInit_cppModule(void) {
    return PyModule_Create(&cppModule);
}

int main() {
    // 初始化 Python 解释器
    Py_Initialize();
    PyObject* pModule = PyImport_AddModule("__main__");
    PyObject* pGlobals = PyModule_GetDict(pModule);

    // 注册 C++ 方法到 Python
    PyObject* pCppModule = PyModule_Create(&cppModule);
    PyDict_SetItemString(pGlobals, "cppModule", pCppModule);

    // 执行 Python 代码
    const auto python_code = R"(
def my_function(capsule):
    result = cppModule.use_object(capsule)  # 传回 C++ 处理
    print(f"Python received: {result}")
    return result
)";
    PyRun_SimpleString(python_code);

    // 获取 Python 函数对象
    if (PyObject* pFunc = PyDict_GetItemString(pGlobals, "my_function"); PyCallable_Check(pFunc)) {
        auto* obj = new MyStruct{42};  // 创建 C++ 对象
        const auto capsule = PyCapsule_New(obj, "this", nullptr); // 返回封装的指针
        // 准备参数
        PyObject* pArgs = PyTuple_Pack(1, capsule);

        // 调用函数
        if (PyObject* pValue = PyObject_CallObject(pFunc, pArgs); pValue != nullptr) {
            // 打印函数返回值
            std::cout << "Function returned: " << PyLong_AsLong(pValue) << std::endl;
            Py_XDECREF(pValue);
        } else {
            PyErr_Print();
        }
        Py_XDECREF(pArgs);
    } else {
        PyErr_Print();
    }

    // 关闭 Python 解释器
    Py_Finalize();
    return 0;
}