Python c包装器:将多类型结构转换为它的python表示(首选字典)

我选择了setuptools来使用
python脚本中的C/C++代码.

构建这样的包装器的一个阶段是将C/C++返回值转换为python对象.

到目前为止,我能够转换简单的原始值和原始值列表.但是,我希望将它扩展为多值结构,如下例所示.

我现在面临的主要挑战是如何创建python结构表示(PyObject * ret = PyList_New(…);)并且我使用不同的类型正确设置它的值.

我试图创建相同类型的项目列表(例如std :: vector< float>)并设法使用Py_BuildValue和PyList_SetItem正确设置值,但我仍在努力解决多种类型……

typedef struct _fileParams 
{
    bool valid;
    int index;
    std::string key;
    std::value value;
} fileParams;

FileDataBase * db;

static PyObject *searchFileInDB(PyObject *self, PyObject *args)
{
    if (db == NULL) 
    {
        PyErr_SetString(PyExc_RuntimeError, "DB could not be initialized");
        return NULL;
    }

    char* fileName = NULL;
    int fileNameSize = 0;
    PyArg_ParseTuple(args, "s#", &fileName, &fileNameSize);
    try 
    {
        fileParams p;
        bool res = db->lookup(fileName, fileNameSize, p);
        PyObject* ret = PyList_New(...);

        if (res) 
        {                    
            PyObject* r1 = Py_BuildValue("b", p.valid);
            PyList_SetItem(ret, 0, r1);

            PyObject* r2 = Py_BuildValue("i", p.index);
            PyList_SetItem(ret, 1, r2);

            PyObject* r1 = Py_BuildValue("s", p.key);
            PyList_SetItem(ret, 2, r3);

            PyObject* r1 = Py_BuildValue("s", p.value);
            PyList_SetItem(ret, 3, r4);
        }
        return ret;
    } catch (...) {
        PyErr_SetString(PyExc_RuntimeError, "failed with C exception");
        return NULL;
    }
}

最佳答案 您可能希望查看Dictionary对象:
Dictionary Objects

我猜你想根据那个doc用PyDict_SetItemString()设置值.

HTH

点赞