Re: [Numpy-discussion] Calling routines from a Fortran library using python
On Mon, 22 Feb 2010 22:18:23 +0900 David Cournapeau courn...@gmail.com wrote: On Mon, Feb 22, 2010 at 10:01 PM, Nils Wagner nwag...@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; # WordBUF[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 ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
Nils Wagner wrote: On Mon, 22 Feb 2010 22:18:23 +0900 David Cournapeau courn...@gmail.com wrote: On Mon, Feb 22, 2010 at 10:01 PM, Nils Wagner nwag...@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; # WordBUF[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 ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
Nils Wagner wrote: On Thu, 11 Mar 2010 13:01:33 +0100 Dag Sverre Seljebotn da...@student.matnat.uio.no wrote: Nils Wagner wrote: On Mon, 22 Feb 2010 22:18:23 +0900 David Cournapeau courn...@gmail.com wrote: On Mon, Feb 22, 2010 at 10:01 PM, Nils Wagner nwag...@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; # WordBUF[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 ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
On Thu, 11 Mar 2010 13:42:43 +0100 Dag Sverre Seljebotn da...@student.matnat.uio.no wrote: Nils Wagner wrote: On Thu, 11 Mar 2010 13:01:33 +0100 Dag Sverre Seljebotn da...@student.matnat.uio.no wrote: Nils Wagner wrote: On Mon, 22 Feb 2010 22:18:23 +0900 David Cournapeau courn...@gmail.com wrote: On Mon, Feb 22, 2010 at 10:01 PM, Nils Wagner nwag...@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; # WordBUF[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 Great. It works like a charme. How can I translate the following C-code into Python ? I don't know how to handle HEAD and memcpy ? Any pointer would be appreciated. Thanks in advance. typedef union { int i; float f; charc[4]; } Word; int I,J,K,N,IDE,IA,IE,IERR,JUNIT,JUNCAT,NDATA,NREC,LREADY,ONE=1; Word BUF[100],HEAD[30]; for (I=5;ILHEAD;I++) HEAD[I].i = 0; HEAD[ 0].i = 1; HEAD[ 1].i = LHEAD + NDATA*7; HEAD[ 2].i = LHEAD; HEAD[ 3].i = NDATA; HEAD[ 4].i = 7; memcpy (HEAD[ 7].c,DSIO,4); memcpy (HEAD[ 8].c,TEST,4); memcpy (HEAD[ 9].c,NPCO,4); memcpy (HEAD[10].c,,4); memcpy (HEAD[11].c,DSIO,4); HEAD[20].i = 1; HEAD[21].i = NDATA; STRING = MM RAD; DSEINH(STRING,HEAD[24].i,ONE, strlen(STRING)); ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
On Mon, 22 Feb 2010 22:18:23 +0900 David Cournapeau courn...@gmail.com wrote: On Mon, Feb 22, 2010 at 10:01 PM, Nils Wagner nwag...@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 Just to play it safe Consider extern void dsio(int* const,const char* const, int* const,const size_t); extern void dsrhed (const int* const,const int* const,void* const, const int* const,const int* const,int* const, int* const,int* const,int* const,int* const, int* const,int* const,int* const); from ctypes import * my_lib = CDLL('libtest.so') How do I call the functions within python I mean what arguments are needed ? my_lib.dsio() my_lib.dsrhed( ) Thank you very much for your help. Cheers, Nils ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
On Thu, 18 Feb 2010 22:29:39 +0900 David Cournapeau courn...@gmail.com wrote: On Thu, Feb 18, 2010 at 10:22 PM, Nils Wagner nwag...@iam.uni-stuttgart.de wrote: On Thu, 18 Feb 2010 11:55:07 +0100 Matthieu Brucher matthieu.bruc...@gmail.com wrote: Ok I have extracted the *.o files from the static library. Applying the file command to the object files yields ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped What's that supposed to mean ? It means that each object file is an object file compiled with -fPIC, so you just have to make a shared library (gfortran -shared *.o -o libmysharedlibrary.so) Then, you can try to open the library with ctypes. If something is lacking, you may have to add -lsome_library to the gfortran line. Matthieu -- Information System Engineer, Ph.D. Blog: http://matt.eifelle.com LinkedIn: http://www.linkedin.com/in/matthieubrucher O.k. I tried gfortran -shared *.o -o libmysharedlibrary.so /usr/bin/ld: dxop.o: relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC The message is pretty explicit: it is not compiled with -fPIC, there is nothing you can do, short of requesting a shared library from the software vendor. David Hi, Meanwhile I received a static library (including -fPIC support) from the software vendor. Now I have used 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 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 ? Nils ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
On Mon, Feb 22, 2010 at 10:01 PM, Nils Wagner nwag...@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
Re: [Numpy-discussion] Calling routines from a Fortran library using python
On Mon, 22 Feb 2010 22:18:23 +0900 David Cournapeau courn...@gmail.com wrote: On Mon, Feb 22, 2010 at 10:01 PM, Nils Wagner nwag...@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. g77 -shared *.o -o libtest.so -lg2c failed with /usr/lib/64/gcc-lib/x86_64-suse-linux/3.3.5/../../../../x86_64-suse-linux/bin/ld: cannot find -lgcc_s IIRC that is a known bug related to SuSE . Are you aware of a solution ? Cheers, Nils 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
[Numpy-discussion] Calling routines from a Fortran library using python
Hi all, I have a static library (*.a) compiled by gfortran but no source files. How can I call routines from that library using python ? Any pointer would be appreciated. Thanks in advance. Nils ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
Nils Wagner wrote: Hi all, I have a static library (*.a) compiled by gfortran but no source files. How can I call routines from that library using python ? Is there any kind of interface (.h, etc...) ? If this is a proprietary library, there has to be something so that it can be called from C, and anything that can be called from C can be called from python. If you don't know at least the functions signatures, it will be very difficult (you would have to disassemble the code to find how the functions are called, etc...). cheers, David ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
On Thu, 18 Feb 2010 18:32:18 +0900 David Cournapeau da...@silveregg.co.jp wrote: Nils Wagner wrote: Hi all, I have a static library (*.a) compiled by gfortran but no source files. How can I call routines from that library using python ? Is there any kind of interface (.h, etc...) ? If this is a proprietary library, there has to be something so that it can be called from C, and anything that can be called from C can be called from python. If you don't know at least the functions signatures, it will be very difficult (you would have to disassemble the code to find how the functions are called, etc...). cheers, David Hi David, you are right. It's a proprietary library. I found a header file (*.h) including prototype declarations of externally callable procedures. How can I proceed ? Thank you again. Cheers, Nils ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
Nils Wagner wrote: On Thu, 18 Feb 2010 18:32:18 +0900 David Cournapeau da...@silveregg.co.jp wrote: Nils Wagner wrote: Hi all, I have a static library (*.a) compiled by gfortran but no source files. How can I call routines from that library using python ? Is there any kind of interface (.h, etc...) ? If this is a proprietary library, there has to be something so that it can be called from C, and anything that can be called from C can be called from python. If you don't know at least the functions signatures, it will be very difficult (you would have to disassemble the code to find how the functions are called, etc...). cheers, David Hi David, you are right. It's a proprietary library. I found a header file (*.h) including prototype declarations of externally callable procedures. How can I proceed ? Exactly as you would do for a C library (ctypes, cython, by hand, swig, etc...). Once you have the header (plus the C-Fortran ABI convention, which depend on your compilers and platforms), it is exactly as calling a C function in a C library, cheers, David ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
You may have to convert the .a library to a .so library. And this is where I hope that the library is compiled with fPIC (which is generally not the case for static libraries). If it is not the case, you will not be able to compile it as a shared library and thus not be able to use it from Python :| Matthieu -- Information System Engineer, Ph.D. Blog: http://matt.eifelle.com LinkedIn: http://www.linkedin.com/in/matthieubrucher ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
On Thu, 18 Feb 2010 10:15:51 + (UTC) Neil Crighton neilcrigh...@gmail.com wrote: Nils Wagner nwagner at iam.uni-stuttgart.de writes: Hi David, you are right. It's a proprietary library. I found a header file (*.h) including prototype declarations of externally callable procedures. How can I proceed ? Apparently you can use ctypes to access fortran libraries. See the first paragraph of: http://www.sagemath.org/doc/numerical_sage/ctypes.html You may have to convert the .a library to a .so library. Neil How do I convert the .a library to a .so library ? Nils ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
Nils Wagner wrote: How do I convert the .a library to a .so library ? You first uncompress the .a into a temporary directory, with ar x on Linux. Then, you group the .o together with gfortran -shared $LIST_OF_OBJECT + a few options. You can also look at how Atlas does it in its makefile. As Matthieu mentioned, if the .o are not compiled with -fPIC, you are screwed on 64 bits architectures (unless you statically link numpy in your python interpreter, but I doubt you want to go that road). It would be somewhat surprising if your vendor did not shared libraries available, though. cheers, David ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
On Thu, 18 Feb 2010 19:21:03 +0900 David Cournapeau da...@silveregg.co.jp wrote: Nils Wagner wrote: On Thu, 18 Feb 2010 18:32:18 +0900 David Cournapeau da...@silveregg.co.jp wrote: Nils Wagner wrote: Hi all, I have a static library (*.a) compiled by gfortran but no source files. How can I call routines from that library using python ? Is there any kind of interface (.h, etc...) ? If this is a proprietary library, there has to be something so that it can be called from C, and anything that can be called from C can be called from python. If you don't know at least the functions signatures, it will be very difficult (you would have to disassemble the code to find how the functions are called, etc...). cheers, David Hi David, you are right. It's a proprietary library. I found a header file (*.h) including prototype declarations of externally callable procedures. How can I proceed ? Exactly as you would do for a C library (ctypes, cython, by hand, swig, etc...). Once you have the header (plus the C-Fortran ABI convention, which depend on your compilers and platforms), it is exactly as calling a C function in a C library, cheers, David To be honest that's over my head. I mean I have never used C before. Where can I find a step-by-step example for my task ? Nils ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
On Thu, 18 Feb 2010 19:30:10 +0900 David Cournapeau da...@silveregg.co.jp wrote: Nils Wagner wrote: How do I convert the .a library to a .so library ? You first uncompress the .a into a temporary directory, with ar x on Linux. Then, you group the .o together with gfortran -shared $LIST_OF_OBJECT + a few options. You can also look at how Atlas does it in its makefile. As Matthieu mentioned, if the .o are not compiled with -fPIC, you are screwed on 64 bits architectures (unless you statically link numpy in your python interpreter, but I doubt you want to go that road). It would be somewhat surprising if your vendor did not shared libraries available, though. cheers, David Ok I have extracted the *.o files from the static library. Applying the file command to the object files yields ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped What's that supposed to mean ? Nils ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
Hi Nils, I've not tried it, but you might be able to interface with f2py your own fortran subroutine that calls the library. Then issue the f2py command with extra arguments -llibname -Ldirectory with lib. See section 5 of http://cens.ioc.ee/projects/f2py2e/usersguide/index.html#command-f2py --George. On 18 February 2010 09:18, Nils Wagner nwag...@iam.uni-stuttgart.de wrote: Hi all, I have a static library (*.a) compiled by gfortran but no source files. How can I call routines from that library using python ? Any pointer would be appreciated. Thanks in advance. Nils ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
Ok I have extracted the *.o files from the static library. Applying the file command to the object files yields ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped What's that supposed to mean ? It means that each object file is an object file compiled with -fPIC, so you just have to make a shared library (gfortran -shared *.o -o libmysharedlibrary.so) Then, you can try to open the library with ctypes. If something is lacking, you may have to add -lsome_library to the gfortran line. Matthieu -- Information System Engineer, Ph.D. Blog: http://matt.eifelle.com LinkedIn: http://www.linkedin.com/in/matthieubrucher ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
If header files are provided, the work done by f2py is almost done. But you don't know the real Fortran interface, so you still have to use ctypes over f2py. Matthieu 2010/2/18 George Nurser gnur...@googlemail.com: Hi Nils, I've not tried it, but you might be able to interface with f2py your own fortran subroutine that calls the library. Then issue the f2py command with extra arguments -llibname -Ldirectory with lib. See section 5 of http://cens.ioc.ee/projects/f2py2e/usersguide/index.html#command-f2py --George. On 18 February 2010 09:18, Nils Wagner nwag...@iam.uni-stuttgart.de wrote: Hi all, I have a static library (*.a) compiled by gfortran but no source files. How can I call routines from that library using python ? Any pointer would be appreciated. Thanks in advance. Nils ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion -- Information System Engineer, Ph.D. Blog: http://matt.eifelle.com LinkedIn: http://www.linkedin.com/in/matthieubrucher ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
I'm suggesting writing a *new* Fortran interface, coupled with f2py. The original library just needs to be linked to the new .so generated by f2py. I am hoping (perhaps optimistically) that can be done in the Fortran compilation... --George. On 18 February 2010 10:56, Matthieu Brucher matthieu.bruc...@gmail.com wrote: If header files are provided, the work done by f2py is almost done. But you don't know the real Fortran interface, so you still have to use ctypes over f2py. Matthieu 2010/2/18 George Nurser gnur...@googlemail.com: Hi Nils, I've not tried it, but you might be able to interface with f2py your own fortran subroutine that calls the library. Then issue the f2py command with extra arguments -llibname -Ldirectory with lib. See section 5 of http://cens.ioc.ee/projects/f2py2e/usersguide/index.html#command-f2py --George. On 18 February 2010 09:18, Nils Wagner nwag...@iam.uni-stuttgart.de wrote: Hi all, I have a static library (*.a) compiled by gfortran but no source files. How can I call routines from that library using python ? Any pointer would be appreciated. Thanks in advance. Nils ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion -- Information System Engineer, Ph.D. Blog: http://matt.eifelle.com LinkedIn: http://www.linkedin.com/in/matthieubrucher ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
If Nils has no access to the Fortran interface (and I don't think he has, unless there is some .mod file somewhere?), he shouldn't use f2py. Even if you know that the Fortran routine is named XXX, you don't know how the arguments must be given. Addressing the C interface directly is much safer. Matthieu 2010/2/18 George Nurser gnur...@googlemail.com: I'm suggesting writing a *new* Fortran interface, coupled with f2py. The original library just needs to be linked to the new .so generated by f2py. I am hoping (perhaps optimistically) that can be done in the Fortran compilation... --George. On 18 February 2010 10:56, Matthieu Brucher matthieu.bruc...@gmail.com wrote: If header files are provided, the work done by f2py is almost done. But you don't know the real Fortran interface, so you still have to use ctypes over f2py. Matthieu 2010/2/18 George Nurser gnur...@googlemail.com: Hi Nils, I've not tried it, but you might be able to interface with f2py your own fortran subroutine that calls the library. Then issue the f2py command with extra arguments -llibname -Ldirectory with lib. See section 5 of http://cens.ioc.ee/projects/f2py2e/usersguide/index.html#command-f2py --George. On 18 February 2010 09:18, Nils Wagner nwag...@iam.uni-stuttgart.de wrote: Hi all, I have a static library (*.a) compiled by gfortran but no source files. How can I call routines from that library using python ? Any pointer would be appreciated. Thanks in advance. Nils ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion -- Information System Engineer, Ph.D. Blog: http://matt.eifelle.com LinkedIn: http://www.linkedin.com/in/matthieubrucher ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion -- Information System Engineer, Ph.D. Blog: http://matt.eifelle.com LinkedIn: http://www.linkedin.com/in/matthieubrucher ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
On Thu, 18 Feb 2010 11:55:07 +0100 Matthieu Brucher matthieu.bruc...@gmail.com wrote: Ok I have extracted the *.o files from the static library. Applying the file command to the object files yields ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped What's that supposed to mean ? It means that each object file is an object file compiled with -fPIC, so you just have to make a shared library (gfortran -shared *.o -o libmysharedlibrary.so) Then, you can try to open the library with ctypes. If something is lacking, you may have to add -lsome_library to the gfortran line. Matthieu -- Information System Engineer, Ph.D. Blog: http://matt.eifelle.com LinkedIn: http://www.linkedin.com/in/matthieubrucher O.k. I tried gfortran -shared *.o -o libmysharedlibrary.so /usr/bin/ld: dxop.o: relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC dscpde.o: could not read symbols: Bad value Any idea ? Nils ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
On Thu, Feb 18, 2010 at 10:22 PM, Nils Wagner nwag...@iam.uni-stuttgart.de wrote: On Thu, 18 Feb 2010 11:55:07 +0100 Matthieu Brucher matthieu.bruc...@gmail.com wrote: Ok I have extracted the *.o files from the static library. Applying the file command to the object files yields ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped What's that supposed to mean ? It means that each object file is an object file compiled with -fPIC, so you just have to make a shared library (gfortran -shared *.o -o libmysharedlibrary.so) Then, you can try to open the library with ctypes. If something is lacking, you may have to add -lsome_library to the gfortran line. Matthieu -- Information System Engineer, Ph.D. Blog: http://matt.eifelle.com LinkedIn: http://www.linkedin.com/in/matthieubrucher O.k. I tried gfortran -shared *.o -o libmysharedlibrary.so /usr/bin/ld: dxop.o: relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC The message is pretty explicit: it is not compiled with -fPIC, there is nothing you can do, short of requesting a shared library from the software vendor. David ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
David Cournapeau wrote: On Thu, Feb 18, 2010 at 10:22 PM, Nils Wagner nwag...@iam.uni-stuttgart.de wrote: On Thu, 18 Feb 2010 11:55:07 +0100 Matthieu Brucher matthieu.bruc...@gmail.com wrote: Ok I have extracted the *.o files from the static library. Applying the file command to the object files yields ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped What's that supposed to mean ? It means that each object file is an object file compiled with -fPIC, so you just have to make a shared library (gfortran -shared *.o -o libmysharedlibrary.so) Then, you can try to open the library with ctypes. If something is lacking, you may have to add -lsome_library to the gfortran line. Matthieu -- Information System Engineer, Ph.D. Blog: http://matt.eifelle.com LinkedIn: http://www.linkedin.com/in/matthieubrucher O.k. I tried gfortran -shared *.o -o libmysharedlibrary.so /usr/bin/ld: dxop.o: relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC The message is pretty explicit: it is not compiled with -fPIC, there is nothing you can do, short of requesting a shared library from the software vendor. Well, I think one can make a static executable with C or Cython and embed the Python interpreter. But it is pretty complicated stuff, and requesting a shared library is vastly preferable. Dag Sverre ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
On Thu, 18 Feb 2010 15:32:12 +0100 Dag Sverre Seljebotn da...@student.matnat.uio.no wrote: David Cournapeau wrote: On Thu, Feb 18, 2010 at 10:22 PM, Nils Wagner nwag...@iam.uni-stuttgart.de wrote: On Thu, 18 Feb 2010 11:55:07 +0100 Matthieu Brucher matthieu.bruc...@gmail.com wrote: Ok I have extracted the *.o files from the static library. Applying the file command to the object files yields ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped What's that supposed to mean ? It means that each object file is an object file compiled with -fPIC, so you just have to make a shared library (gfortran -shared *.o -o libmysharedlibrary.so) Then, you can try to open the library with ctypes. If something is lacking, you may have to add -lsome_library to the gfortran line. Matthieu -- Information System Engineer, Ph.D. Blog: http://matt.eifelle.com LinkedIn: http://www.linkedin.com/in/matthieubrucher O.k. I tried gfortran -shared *.o -o libmysharedlibrary.so /usr/bin/ld: dxop.o: relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC The message is pretty explicit: it is not compiled with -fPIC, there is nothing you can do, short of requesting a shared library from the software vendor. Well, I think one can make a static executable with C or Cython and embed the Python interpreter. But it is pretty complicated stuff, and requesting a shared library is vastly preferable. Dag Sverre Can you shed light on your approach ? Nils ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
Nils Wagner wrote: On Thu, 18 Feb 2010 15:32:12 +0100 Dag Sverre Seljebotn da...@student.matnat.uio.no wrote: David Cournapeau wrote: On Thu, Feb 18, 2010 at 10:22 PM, Nils Wagner nwag...@iam.uni-stuttgart.de wrote: On Thu, 18 Feb 2010 11:55:07 +0100 Matthieu Brucher matthieu.bruc...@gmail.com wrote: Ok I have extracted the *.o files from the static library. Applying the file command to the object files yields ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped What's that supposed to mean ? It means that each object file is an object file compiled with -fPIC, so you just have to make a shared library (gfortran -shared *.o -o libmysharedlibrary.so) Then, you can try to open the library with ctypes. If something is lacking, you may have to add -lsome_library to the gfortran line. Matthieu -- Information System Engineer, Ph.D. Blog: http://matt.eifelle.com LinkedIn: http://www.linkedin.com/in/matthieubrucher O.k. I tried gfortran -shared *.o -o libmysharedlibrary.so /usr/bin/ld: dxop.o: relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC The message is pretty explicit: it is not compiled with -fPIC, there is nothing you can do, short of requesting a shared library from the software vendor. Well, I think one can make a static executable with C or Cython and embed the Python interpreter. But it is pretty complicated stuff, and requesting a shared library is vastly preferable. Dag Sverre Can you shed light on your approach ? If one searches the Cython lists (gmane.org) for embedding python interpreter it should give some hints as to how to compile a Cython .pyx module into an executable (so you get an executable which links in Python, and which has to be used instead of Python). There's even some flags in Cython to do this easily. Ask on the Cython list for more info, I don't know more myself. Then, one could link the static Fortran library into the resulting application statically, and use Cython to call the exported functions in the Fortran library. But, the result is a standalone application, one can't use it with the standard Python interpreter (although one can import in any .py files etc. as usual). Dag Sverre ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
Christopher Barker wrote: Matthieu Brucher wrote: If it is not the case, you will not be able to compile it as a shared library and thus not be able to use it from Python :| maybe not directly with ctypes, but you should be able to call it from Cython (or SWIG, or custom C code), and statically link it. If it is not compiled with -fPIC, you can't statically link it into any shared library, it has to be statically linked into the final executable (so the standard /usr/bin/python will never work). Dag Sverre ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
Dag Sverre Seljebotn wrote: If it is not compiled with -fPIC, you can't statically link it into any shared library, it has to be statically linked into the final executable (so the standard /usr/bin/python will never work). Shows you what I (don't) know! The joys of closed-source software! On a similar topic -- is it possible to convert a *.so to a static lib? (on OS-X)? I did a bunch a googling a while back, and couldn't figure it out. -Chris -- Christopher Barker, Ph.D. Oceanographer Emergency Response Division NOAA/NOS/ORR(206) 526-6959 voice 7600 Sand Point Way NE (206) 526-6329 fax Seattle, WA 98115 (206) 526-6317 main reception chris.bar...@noaa.gov ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
2010/2/18 Christopher Barker chris.bar...@noaa.gov: Dag Sverre Seljebotn wrote: If it is not compiled with -fPIC, you can't statically link it into any shared library, it has to be statically linked into the final executable (so the standard /usr/bin/python will never work). Shows you what I (don't) know! The joys of closed-source software! On a similar topic -- is it possible to convert a *.so to a static lib? (on OS-X)? I did a bunch a googling a while back, and couldn't figure it out. I don't think you can. A static library is nothing more than an archive of object files (a Fortran module file is the same BTW), a dynamic library is one big object with every link created. Going from the latter to the former cannot be easilly done. Matthieu -- Information System Engineer, Ph.D. Blog: http://matt.eifelle.com LinkedIn: http://www.linkedin.com/in/matthieubrucher ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion
Re: [Numpy-discussion] Calling routines from a Fortran library using python
Dag Sverre Seljebotn wrote: Well, I think one can make a static executable with C or Cython and embed the Python interpreter. Yes, it is possible, but I think it is fair to say that if you don't know how to write a C extension, statically build numpy into python would be daunting :) David ___ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion