数组、结构体和 Pyrex¶
日期 | 2007-11-18(最后修改),2006-01-06(创建) |
---|
注意:此条目最后更新于 2007-11-18,可能包含截至 2013 年不再相关的的信息。
概述¶
Pyrex 是一种用于编写 Python C 扩展的语言。其语法与编写 Python 非常相似。一个文件被编译成一个文件,然后像标准的 Python C 扩展模块一样进行编译。许多人发现使用 Pyrex 编写扩展模块比用 C 编写或使用其他工具(如 SWIG)更可取。
请参阅 http://numeric.scipy.org/ 以了解接口的说明。以下软件包支持该接口
!NumPy (所有版本) Numeric (>=24.2) * numarray (>=1.5.0)
共享由基于 Pyrex 的扩展分配的内存数据¶
这是一个 Pyrex 文件,展示了如何使用数组接口导出其数据。这允许各种 Python 类型查看数据,而无需实际复制数据本身。
在 [ ]
cdef extern from "Python.h":
ctypedef int Py_intptr_t
void Py_INCREF(object)
void Py_DECREF(object)
object PyCObject_FromVoidPtrAndDesc( void* cobj, void* desc, void (*destr)(void *, void *))
cdef extern from "stdlib.h":
ctypedef int size_t
ctypedef long intptr_t
void *malloc(size_t size)
void free(void* ptr)
# for PyArrayInterface:
CONTIGUOUS=0x01
FORTRAN=0x02
ALIGNED=0x100
NOTSWAPPED=0x200
WRITEABLE=0x400
ctypedef struct PyArrayInterface:
int version # contains the integer 2 as a sanity check
int nd # number of dimensions
char typekind # kind in array --- character code of typestr
int itemsize # size of each element
int flags # flags indicating how the data should be interpreted
Py_intptr_t *shape # A length-nd array of shape information
Py_intptr_t *strides # A length-nd array of stride information
void *data # A pointer to the first element of the array
cdef void free_array_interface( void* ptr, void *arr ):
cdef PyArrayInterface* inter
inter = <PyArrayInterface*>ptr
arrpy = <object>arr
Py_DECREF( arrpy )
free(inter)
ctypedef unsigned char fi
ctypedef fi* fiptr
cdef class Unsigned8Buf:
cdef fiptr data
cdef Py_intptr_t shape[2]
cdef Py_intptr_t strides[2]
def __init__(self, int width, int height):
cdef int bufsize
bufsize = width*height*sizeof(fi)
self.data=<fiptr>malloc( bufsize )
if self.data==NULL: raise MemoryError("Error allocating memory")
self.strides[0]=width
self.strides[1]=1 # 1 byte per element
self.shape[0]=height
self.shape[1]=width
def __dealloc__(self):
free(self.data)
property __array_struct__:
def __get__(self):
cdef PyArrayInterface* inter
cdef Py_intptr_t *newshape # A length-nd array of shape information
cdef Py_intptr_t *newstrides # A length-nd array of stride information
cdef int nd
nd = 2
inter = <PyArrayInterface*>malloc( sizeof( PyArrayInterface ) )
if inter is NULL:
raise MemoryError()
inter.version = 2
inter.nd = nd
inter.typekind = 'u'[0] # unsigned int
inter.itemsize = 1
inter.flags = NOTSWAPPED | ALIGNED | WRITEABLE
inter.strides = self.strides
inter.shape = self.shape
inter.data = self.data
Py_INCREF(self)
obj = PyCObject_FromVoidPtrAndDesc( <void*>inter, <void*>self, free_array_interface)
return obj
使用在其他地方分配的内存与基于 Pyrex 的扩展¶
一个例子是 _cam_iface_shm.pyx 中的 get_data_copy() 函数,该函数位于 motmot 相机实用程序 软件中。在这个使用示例中,图像从共享内存复制到一个外部分配的缓冲区,该缓冲区支持 {{{array_struct}}} 接口。(共享内存部分只在 Linux 上测试过,但其他部分应该在任何地方都能工作。)
另请参阅¶
- ["Cookbook/Pyrex_and_NumPy"]
章节作者:AndrewStraw、DavidLinke、Unknown[25]