我想从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中找到解决方法我问过,虽然这个解决方案不是首选使用不推荐使用的接口。
答案 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)