Interfacing python and C

Nick Craig-Wood nick at craig-wood.com
Sat Mar 28 08:30:03 EDT 2009


MRAB <google at mrabarnett.plus.com> wrote:
>  steve William wrote:
> > Hi All,
> > 
> > I'm using SWIG for the first time and I am facing some problems with 
> > user defined header files. I'm trying to use my own header file in a C 
> > program which would be interfaced with python.
> > 
> > The header file is test.h:
> > /#include <stdio.h>
> > 
> > int fact(int n) {
> >      if (n <= 1) return 1;
> >      else return n*fact(n-1);
> > }/
> >    
> > The C program is test1.c:
> > /#include <stdio.h>
> > #include "test.h"
> > 
> > int calc_fact(int a)
> > {
> >     return (fact(a));
> > }/
> > 
> > The interface file is test1.i:
> > /%module test1
> > 
> > %{
> > #include "stdio.h"
> > #include "test.h"
> >  %}
> > 
> > int calc_fact(int a);/
> > 
> > The commands that I used to generate the wrappers are:
> > /swig -python test1.i
> > gcc -c test1.c test1_wrap.c -I/usr/include/python2.5 
> > -I/usr/lib/python2.5/config
> > g++ -shared test1_wrap.o -o _test1.so/

gcc not g++ here

link test1.o also

gcc -shared test1.o test1_wrap.o -o test1.so

> > When I try to import test1, I get an error saying:
> > />>> import test1
> > Traceback (most recent call last):
> >   File "<stdin>", line 1, in <module>
> >   File "test1.py", line 22, in <module>
> >     import _test1
> > ImportError: ./_test1.so: undefined symbol: calc_fact/

Try nm or objdump on the .so to see what symbols are in it.

> > I'm not sure why this is happening because when I try without user 
> > defined header file, it works. Also the error says that it does not 
> > recognize /calc_fact/ which is a function that I want to access from 
> > python and is declared in the interface file.
> > 
> > Is there any specific way in which user defined headers need to be 
> > declared in the interface file? Should the user defined header be placed 
> > in the /usr/include  directory?
> > 
> > Any help on this is highly appreciated.

My advice to you is to compile the C stuff into a .so and use ctypes
instead of swig.  You then write the interface code in python not C
and you'll have a lot more fun!

cython is very useful in this area too provided you don't mind an
extra dependency.  If you are developing C code from scratch to
use with python, then write it in cython instead!

>  Should you be putting a function body in a header file?

No

-- 
Nick Craig-Wood <nick at craig-wood.com> -- http://www.craig-wood.com/nick



More information about the Python-list mailing list