使用CFFI在Python中创建CData类型的缓冲区

时间:2016-05-13 19:54:29

标签: python c buffer python-cffi

我正在尝试在Python中创建一个特殊类型的缓冲区,将其发送到用CFFI包装的C函数。

在C中,我有类似的东西:

typedef unsigned char UINT8;
typedef UINT8* PUINT8;

然后,在Python中,上面的行在ffi.cdef()中,我的缓冲区实例化代码如下所示:

nb_buffer = 8
buffer_size = 42

buffers = ffi.new( "PUINT8[]", nb_buffer )

for i in range( nb_buffer ):
    tmp_buffer = ffi.buffer( ffi.new( "UINT8[]", 1 ), buffer_size )
    buffers[ i ] = ffi.cast( "PUINT8", ffi.from_buffer( tmp_buffer ) )

c.function( buffers )

C函数接收UINT8 **。

并且......在C函数中以更远的分段错误结束。

使用print buffers[ i ]后我ffi.cast

<cdata 'unsigned char *' 0x2cbaca0>
<cdata 'unsigned char *' 0x2cbacd8>
<cdata 'unsigned char *' 0x2cbaca0>
<cdata 'unsigned char *' 0x2cbacd8>
<cdata 'unsigned char *' 0x2cbaca0>
<cdata 'unsigned char *' 0x2cbacd8>
<cdata 'unsigned char *' 0x2cbaca0>
<cdata 'unsigned char *' 0x2cbacd8>

我错过了什么?一旦覆盖tmp_buffer

,缓冲区是否被垃圾收集

2 个答案:

答案 0 :(得分:2)

怎么样:

buffers = ffi.new( "PUINT8[]", nb_buffer )
keepalive = []

for i in range( nb_buffer ):
    p = ffi.new("UINT8[]", buffer_size)
    keepalive.append(p)
    buffers[i] = p

c.function( buffers )

# keepalive stays alive at least until here

答案 1 :(得分:0)

使用列表理解:

keepalive = [ ffi.new( "UINT8[]", buffer_size ) for i in range( nb_buffer ) ]
buffers = ffi.new( "PUINT8[]", keepalive )

c.functions( buffers )

# keepalive stays alive at least until here