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

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


Nils Wagner wrote:
> On Thu, 11 Mar 2010 13:01:33 +0100
>   Dag Sverre Seljebotn <dagss@student.matnat.uio.no> 
> wrote:
>   
>> 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
>>     
>   
>
> Sorry, I am newbie to C. What is the correct way ?
>
>   

my_dsio.dsio(byref(JUNCAT),FDSCAT,byref(IERR),LDSNCAT) 

Dag



More information about the NumPy-Discussion mailing list