将Python结构解析为PyObject

时间:2015-04-06 02:23:32

标签: python c python-c-api python-embedding

我从python函数返回以下结构的对象

class Bus(Structure):
    _fields_ = [ ("a", c_int), 
                 ("b", c_char), 
                 ("c", c_float), 
                 ("d", c_double), 
                 ("e", c_char_p) 
               ]

def GetBus(  *args, **kwargs ):
    Signal = cast(c_char_p(kwargs['Bus']), POINTER(Bus )).contents
    ## Logic that updates Signal
    return Signal

在我的C代码中,我希望通过解析bus来更新我的C结构pValue,获取自:

  Bus bus ;
  python_Bus = Py_BuildValue("s#",  (char* )&bus,  sizeof(Bus)) ;
  PyDict_SetItemString( pDict,"Bus", python_Bus ) ;

  PyObject* pValue = PyObject_Call(pFunc, pArgs,pDict) ;

如何解析pValue

Py???_???(pvalue, ???) ;吗?或者如何将其转换为char*并在我的C代码中执行memcpy(如果这样)?


我也尝试过创建一个新的Python类型,但看起来在我的“Py_BuildValue”函数中归结为getter,我不希望有几个“{{1} “对于每个元素。

使用Python2.7

1 个答案:

答案 0 :(得分:2)

假设您使用ctypes.Structure,则可以使用Buffer interface的实现。

尝试类似:

Py_buffer view = { 0 };
PyObject_GetBuffer(pvalue, &view, PyBUF_SIMPLE);
// use view.buf, which is of void*
PyBuffer_Release(&view);

您可能需要添加一些错误处理以确保获取正确的数据。