[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