How do I call Python/C API routines?
Declare them as C functions inside a cdef extern from block.
Use the type name object for any parameters and return types which
are Python object references. Don't use the word const anywhere.
Here is an example which defines and uses the PyString_FromStringAndSize routine:
cdef extern from "Python.h":
object PyString_FromStringAndSize(char *, int)
cdef char buf
my_string = PyString_FromStringAndSize(buf, 42)
How do I convert a C string containing null
bytes to a Python string?
Put in a declaration for the PyString_FromStringAndSize API routine
and use that. See How do I call Python/C API
How do I access the data inside a Numeric
Use a cdef extern from block to include the Numeric header file
and declare the array object as an external extension type. The following
code illustrates how to do this:
cdef extern from "Numeric/arrayobject.h":
int type_num, elsize
ctypedef class Numeric.ArrayType [object PyArrayObject]:
cdef char *data
cdef int nd
cdef int *dimensions,
cdef object base
cdef PyArray_Descr *descr
cdef int flags
For more information about external extension types, see the "External Extension Types"
section of the "Extension Types" documentation
Pyrex says my extension type object has no attribute
'rhubarb', but I know it does. What gives?
You're probably trying to access it through a reference which Pyrex thinks
is a generic Python object. You need to tell Pyrex that it's a reference
to your extension type by means of a declaration. For example,
cdef class Vegetables:
Also see the "Attributes"
section of the "Extension
Types" documentation page.
cdef int rhubarb
cdef Vegetables veg
veg.rhubarb = 42
Python says my extension type has no method called 'quack', but I know it does. What gives?
You may have declared the method using cdef instead of def. Only functions and methods declared with def are callable from Python code.