[Numpy-discussion] Calling routines from a Fortran library using python
Nils Wagner
nwagner at iam.uni-stuttgart.de
Thu Mar 11 07:38:57 EST 2010
On Thu, 11 Mar 2010 13:01:33 +0100
Dag Sverre Seljebotn <dagss at student.matnat.uio.no>
wrote:
> 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
Sorry, I am newbie to C. What is the correct way ?
Nils
More information about the NumPy-Discussion
mailing list