[Numpy-discussion] Calling routines from a Fortran library using python

Nils Wagner nwagner@iam.uni-stuttgart...
Thu Mar 11 05:55:29 CST 2010


On Mon, 22 Feb 2010 22:18:23 +0900
  David Cournapeau <cournape@gmail.com> wrote:
> On Mon, Feb 22, 2010 at 10:01 PM, Nils Wagner
> <nwagner@iam.uni-stuttgart.de> wrote:
> 
>>
>> ar x test.a
>> gfortran -shared *.o -o libtest.so -lg2c
>>
>> to build a shared library. The additional option -lg2c 
>>was
>> necessary due to an undefined symbol: s_cmp
> 
> You should avoid the -lg2c option at any cost if 
>compiling with
> gfortran. I am afraid that you got a library compiled 
>with g77. If
> that's the case, you should use g77 and not gfortran. 
>You cannot mix
> libraries built with one with libraries with another.
> 
>>
>> Now I am able to load the shared library
>>
>> from ctypes import *
>> my_lib = CDLL('test.so')
>>
>> What are the next steps to use the library functions
>> within python ?
> 
> You use it as you would use a C library:
> 
> http://python.net/crew/theller/ctypes/tutorial.html
> 
> But the fortran ABI, at least for code built with g77 
>and gfortran,
> pass everything by reference. To make sure to pass the 
>right
> arguments, I strongly suggest to double check with the 
>.h you
> received.
> 
> cheers,
> 
> David
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion@scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion

Hi all,

I tried to run the following script.
The result is a segmentation fault.
Did I use byref correctly ?

from ctypes import *
my_dsio = CDLL('libdsio20_gnu4.so')      # loading dynamic 
link libraries
#
# FORTRAN : CALL DSIO(JUNCAT,FDSCAT,IERR)
# 
#     int 
        I,J,K,N,IDE,IA,IE,IERR,JUNIT,JUNCAT,NDATA,NREC,LREADY,ONE=1;
#     Word        BUF[100],HEAD[30];
#     char        *PATH,*STRING;
#     char        *PGNAME,*DATE,*TIME,*TEXT;
#     int         LHEAD=30;
#
# C       : DSIO(&JUNCAT,FDSCAT,&IERR,strlen(FDSCAT));
#


IERR    = c_int()
FDSCAT  = c_char_p('dscat.ds')
JUNCAT  = c_int()
LDSNCAT = c_int(len(FDSCAT.value))
print
print 'LDSNCAT', LDSNCAT.value
print 'FDSCAT' , FDSCAT.value  , len(FDSCAT.value)

my_dsio.dsio(byref(JUNCAT),byref(FDSCAT),byref(IERR),byref(LDSNCAT)) 
# segmentation fault
print IERR.value


Any idea ?

  Nils


More information about the NumPy-Discussion mailing list