我创建了一个共享库。我就像那样使用它
class CAudioRecoveryStrategy(AbstractAudioRecoveryStrategy):
def __init__(self):
array_1d_double = npct.ndpointer(dtype=numpy.double, ndim=1, flags='CONTIGUOUS')
self.lib = npct.load_library("libhello", ".")
self.lib.demodulate.argtypes = [array_1d_double, array_1d_double, ctypes.c_int]
def demodulate(self, input):
output = numpy.empty_like(input)
self.lib.demodulate(input, output, input.size)
return output
现在我有一个问题,就是在c ++代码中我只有指向输出数据数组的指针,而不是数组。所以我无法返回数组,除非我手动复制它。
这样做的正确方法是什么?它必须是高效的(如对齐的内存等)。
答案 0 :(得分:2)
Numpy数组实现缓冲协议,请参阅
https://docs.python.org/2/c-api/buffer.html。特别是,
将输入对象解析为PyObject *(转换O
如果你是
然后使用PyArg_ParseTuple
或PyArg_ParseTupleAndKeywords
)
执行PyObject_CheckBuffer
,以确保该类型支持
协议(numpy数组),然后PyObject_GetBuffer
填写
一个Py_buffer
结构,包含物理地址,尺寸,
底层内存块的等等。返回一个numpy缓冲区
更复杂;总的来说,我发现它足够了
创建我自己类型的对象,它也支持缓冲区
协议(在tp_as_buffer
中将PyTypeObject
设置为非null。
否则(但我还没有尝试过),你必须这样做
导入numpy模块,获取其array
属性,调用它
正确的参数,然后使用上面的缓冲协议
你构造的对象。