[Numpy-discussion] Calling routines from a Fortran library using python
Dag Sverre Seljebotn
dagss at student.matnat.uio.no
Thu Mar 11 07:01:33 EST 2010
Nils Wagner wrote:
> On Mon, 22 Feb 2010 22:18:23 +0900
> David Cournapeau <cournape at gmail.com> wrote:
>
>> On Mon, Feb 22, 2010 at 10:01 PM, Nils Wagner
>> <nwagner at 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 at 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