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

Dag Sverre Seljebotn dagss@student.matnat.uio...
Thu Mar 11 06:01:33 CST 2010


Nils Wagner wrote:
> 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 ?
>   
You shouldn't have byref on FDSCAT nor LDSNCAT, as explained by this line:

# C       : DSIO(&JUNCAT,FDSCAT,&IERR,strlen(FDSCAT));

Dag Sverre


More information about the NumPy-Discussion mailing list