使用 CFFI 在 Python 中创建 CData 类型的缓冲区
Create a CData-typed buffer in Python with 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
?
怎么样:
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
使用列表理解:
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
我正在尝试在 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
?
怎么样:
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
使用列表理解:
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