[Numpy-discussion] Calling routines from a Fortran library using python
Nils Wagner
nwagner at iam.uni-stuttgart.de
Thu Mar 11 06:55:29 EST 2010
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 ?
Nils
More information about the NumPy-Discussion
mailing list