如果有帮助,我对有关Python 3的答案很感兴趣。

文档状态(herehere)指出,应在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/

10-10 21:16
查看更多