使用SWIG从C ++指针创建Python缓冲区对象?

时间:2015-02-10 07:54:58

标签: python numpy swig

我想从C ++指针创建一个Python缓冲区对象(可写或不可写),这样它就可以传递给numpy.frombuffer函数。有人能告诉我怎么做吗?

这是我的示例SWIG包装的C ++函数,它返回一个指针:

uint8_t* some_function() {return new uint8_t[200];}

在SWIG包装之后,我跟着this post在python中创建了一个缓冲区对象:

x = some_function()
b = buffer_frompointer(x)
z = numpy.frombuffer(b, dtype=numpy.uint8)

最后一个语句返回错误,指出找不到__buffer__属性。我想这是因为这里的变量b实际上并不是python意义上的缓冲对象。那我该怎么办?

PS。在创建numpy数组时,我不想要额外的内存副本。

PS。现在让我们不要担心内存泄漏问题。

更新:

我仍然对这个问题的解决方案感兴趣,但是如果没有人回答,我会在another question中找到解决方法我问过,虽然这个解决方案不是首选使用不推荐使用的接口。

1 个答案:

答案 0 :(得分:0)

import ctypes, numpy
bptr = int(b.cast())
barray = ctypes.c_byte*200
barray = barray.from_address(bptr)
z = numpy.ctypeslib.as_array(barray)