将 Python 结构解析为 PyObject

Parsing Python Structure as PyObject

我从 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 代码中,我想通过解析从 :

获得的 pValue 来更新我的 C 结构 bus
  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 类型,但看起来在我的“getter”函数中它都归结为 Py_BuildValue,我不想拥有每个元素有几个“setters”。

使用Python2.7

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

试试这样的东西:

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

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