如果有帮助,我对有关Python 3的答案很感兴趣。
文档状态(here和here)指出,应在PyBuffer_Release()
之后使用PyArg_Parse*()
,s*
调用y*
。
关于Py_BuildValue()
的内容一无所有。是疏忽大意,还是Py_BuildValue()
就足够了?
这是我的具体情况:
uint8_t buf = (uint8_t *)malloc(bufSize);
PyObject *pyBuf = Py_BuildValue("y#", (char *)buf, bufSize);
free(buf);
// do something with pyBuf
// maybe a PyBuffer_Release(get_underlying_buffer(pyBuf)) here?
Py_DECREF(pyBuf);
最佳答案
我想不是:
在PyArg_Parse*
和Py_BuildValue
函数中,y#
均指字符串和长度,而不是缓冲区,因此没有基础缓冲区对象要释放。Py_BuildValue
的文档说:
当将内存缓冲区作为参数传递以提供数据以构建对象时(对于s和s#格式),将复制所需的数据。由Py_BuildValue()创建的对象永远不会引用调用者提供的缓冲区。
锁定PyArg_Parse*
使用的缓冲区的目的是,您已经引用了Python之外的一些数据到C,并且希望在C中对其进行处理而不会被Python修改。在这种情况下,您已将一些数据从C复制到Python中,因此无需保护原始数据免于修改。
关于python - 在Py_BuildValue(“y#”,…)之后是否需要PyBuffer_Release?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51172546/