将 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);
您可能想要添加一些错误处理以确保获得正确的数据。
我从 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);
您可能想要添加一些错误处理以确保获得正确的数据。