On Aug 18, 2009, at 7:02 AM, Johan Grönqvist wrote: > Hi, > > I am trying to define a c struct and wrap it in a python object, but > fail to make cython accept my .pyx files. > > My intention is to define c structs that are passed to cdefs (for more > efficient function calls) and wrap them in extension types that allow > for greater flexibility and higher level programming. > > > > I use three files: > > vector.pxd and vector.pyx define the cdef struct and wrapper > extension type > > vector_test.pyx defines a variable whose type is the extension type, > extracts the c struct, and attempts an operation on it. > > My files contain: > > File vector.pxd: > ================ > cdef struct vector_c: > double x, y, z > > cdef class vector: > cdef: > vector_c data > vector_c get_data(self) > ================ > > File vector.pyx > ================ > cdef class vector: > def __init__(self, double x, double y, double z): > self.data.x = x > self.data.y = y > self.data.z = z > > cdef vector_c get_data(vector self): > return self.data > > def __getitem__(self, ix): > if ix==0: > return self.data.x > elif ix == 1: > return self.data.y > elif ix == 2: > return self.data.z > else: > raise "Error" > ============================== > > > File vector_test.pyx > ============================== > import vector > cimport vector > > v = vector.vector(1.0, 1.0, 0.0)
# v is (implicitly) declared to be a Python object. You need to declare it to be a vector. > cdef: > vector.vector_c w = (v.get_data()) # v.get_data is treated as a Python function, because it thinks v is a Python object. > > double x = v[0] > double xx = w.x > > print x > print xx > ============================== > > > > The first two files can be converted to c-code by issuing "cython > vector.pyx". When running "cython vector_test.pyx", I get the error > message > > ============================================= > Error converting Pyrex file to C: > ------------------------------------------------------------ > ... > import vector > cimport vector > > v = vector.vector(1.0, 1.0, 0.0) > cdef: > vector.vector_c w = (v.get_data()) > ^ > ------------------------------------------------------------ > > /home/johan/Work/Elasticity/Program/Python/vector_test.pyx:6:35: > Cannot > convert Python object to 'vector_c' > ============================================= > > I am surprised by this message, as I think that no conversion > should be > necessary. When I look at the previously generated vector.c I see that > the function get_data should return a pure c struct and not a > PyObject. > > Grateful for any help. > > / johan > > _______________________________________________ > Cython-dev mailing list > [email protected] > http://codespeak.net/mailman/listinfo/cython-dev _______________________________________________ Cython-dev mailing list [email protected] http://codespeak.net/mailman/listinfo/cython-dev
