2014-06-13 69 views
0

我想用用Cython运行在python3环境中的C++库。 当我试图将int数组返回到蟒蛇是这样的:转换数组c到Python字节

def readBytes(self, length): 
    cdef int *buffer = [] 
    self.stream.read(buffer, length) 
    return buffer 

我得到的错误

return buffer 
       ^
Cannot convert 'int *' to Python object 

附:如果我使用

cdef char *buffer = '' 
+0

它看起来像stream.read()分配'buffer'指向的内存。如果是这样的话,你不能返回到C++空间分配的python空间数据。 – gg349

+0

@flebool如何在char上工作? –

+0

见答案,太短留在这里 – gg349

回答

0

char可以自动强制为bytes,因为用Cython认为他们是大致相同的,可以做快我不明白的错误。请注意,char *指针将默认为空终止。

这不是int *实现。您通常需要coerce to a Numpy object(这实际上是包装数组)。如果你想要更快的东西,想想cpython.array

+0

不知道如何将这种(强迫到numpy的对象)适用于我的代码,我已经试过了,它给我一个错误:指针基类型不匹配cython.array基本类型 –

+0

注意,简单地强制数组将泄漏指向内存。只有当您计划在本地(在cython中)使用数据并返回与数据本身不同的东西时,这才是一个好主意。 – gg349

1

它看起来像stream.read()分配由buffer指向的内存。如果是这样的话,你不能返回到C++空间分配的python空间数据。你应该:

1)创建一个Python对象,或numpy数组,如果你愿意,在python /用Cython代码

2)由*buffer指出,分配新的闪亮Python对象所分配的内存中的数据复制在python空间。然后你可以返回这个对象。

这是必要的,因为python无法以任何方式处理在C空间中分配的内存,并且您的C代码分配的内存正在泄漏,即它不会被释放。

现在你还问,为什么你不cdef char *buffer = ''得到错误。在后一种情况下,cython识别出buffer指向一个字符串,并自动生成一个新的Python对象,其内容指向buffer。例如遵循ipython

%%cython 
def ReturnThisString(): 
    cdef char *buffer = 'foobar' 
    return buffer 

print ReturnThisString() #this outputs 'foobar' 

注意buffer由您C编译器堆栈初始化,而且也没有保证,当你从蟒蛇使用此函数的字符串将仍然存在于内存位置。但是,当cython运行return语句时,它会自动从你的char *指针初始化一个python字符串。 (在python 3中,我认为它被转换为bytes @Veedrac说,但这是一个小问题)。在这第二种情况下,Python对象的创建和复制操作是隐藏的并由cython保留,但它仍然存在。