Use Pyrex instead (Re: newbie at SWIG, help needed with typemaps)

Duncan Booth duncan at NOSPAMrcp.co.uk
Tue Apr 1 03:43:58 EST 2003


achrist at easystreet.com wrote in news:3E87E64C.F7D2C11E at easystreet.com:

> "Greg Ewing (using news.cis.dfn.de)" wrote:
>> 
>> Instead of SWIG, you might prefer to use Pyrex to wrap your C code:
>> 
>>     http://www.cosc.canterbury.ac.nz/~greg/python/Pyrex/
>> 
>> This is exactly the sort of problem I designed Pyrex to solve.
> 
> Looks almost too nice to be true.  Any reliability or performance
> issues?
> 
> Any reason to think this won't work with Windows and MSVC?

I'm giving a talk at the UK Python conference about integrating Python with 
C/C++, so I've been playing about with Pyrex a bit recently. I can highly 
recommend it.

Remember it is still a work in progress. This means that if you really push 
the envelope, you may find some areas where it becomes less friendly[1], 
probably because nobody else has been there before you. However, most of 
the time it will really amaze you. When you get an extension written using 
the C Api or SWIG wrong, you spend an age in the debugger. When you get 
your Pyrex extension wrong, you get a Python exception and stack backtrace.

If you use Distutils to do the compilation then you won't even have to 
worry about what compiler options to use: your extension will compile on 
anything that has a compiler. If you want to write your own makefiles you 
may have to think a bit harder, but I can post a simple Pyrex makefile for 
msvc if anyone wants it (actually I'll make a point of putting my talk 
slides and associated examples on the web after the conference).

My only other complaint would be that the documentation is perhaps a little 
bit sparse. Probably it just needs some more examples.

[1] An example where it becomes less friendly. The documentation says that 
to do class methods you have to write the function outside the class:

    	def Spam_method(cls):
    	    	pass

     class Spam:
    	    	method = classmethod(Spam)

I, of course, misread this and wrote:

     cdef class Spam:
    	    	method = classmethod(Spam)

This gives an error from the C compiler: 'method' undeclared identifier.
Fair enough that it doesn't work (the documentation sort of says it won't), 
but not so good that it generated bad C code. (For those who don't know 
Pyrex, 'class Spam' generates a Python class 'Spam', 'cdef class Spam' 
generates a new built-in type 'Spam'.)

-- 
Duncan Booth                                             duncan at rcp.co.uk
int month(char *p){return(124864/((p[0]+p[1]-p[2]&0x1f)+1)%12)["\5\x8\3"
"\6\7\xb\1\x9\xa\2\0\4"];} // Who said my code was obscure?




More information about the Python-list mailing list