[Numpy-discussion] f2py: Exposing parameters from "used" modules

Jeremy Solbrig jeremy.solbrig at nrlmry.navy.mil
Tue Jun 18 15:19:34 EDT 2013


Hi all,

I assume that this question is addressed somewhere, but I have spent an 
inordinate amount of time looking around for the answer including 
digging into the source code a bit.  I have tried to put the basic 
problem in the first paragraph.  The rest of the email shows a basic 
example of the problem.  This question is also available here:

http://stackoverflow.com/questions/17156125/f2py-exposing-parameters-from-used-modules

I am attempting to compile a module that contains a "use" statement that 
points to another, more general, module.  I would prefer to keep the 
used module separate so that it can be used in several "packages" as a 
set of general settings.  When I compile the two modules using f2py 
everything works as advertised from the fortran side, but from the 
python side the use statement appears to be ignored.  If I allow f2py to 
generate a signature file, the file contains a use statement as is 
appropriate, but if I complete the compilation and import from the 
resulting library the parameters from the used module are not available 
in the module that contains the use statement.  Below are two modules 
illustrating the situation:

#Contents of test.f90
MODULE test
     INTEGER, PARAMETER :: a = 1
END MODULE test

#Contents of test2.f90
MODULE test2
     USE test
     INTEGER, PARAMETER :: b = 2
END MODULE test2

In order to show the intermediate step I ran "f2py -h test.pyf test.f90 
test2.f90".  The following signature file is generated; note that the 
"test2" module contains "use test":

!    -*- f90 -*-
! Note: the context of this file is case sensitive.

python module test ! in
     interface  ! in :test
         module test ! in :test:test.f90
             integer, parameter,optional :: a=1
         end module test
         module test2 ! in :test:test2.f90
             use test
             integer, parameter,optional :: b=2
         end module test2
     end interface
end python module test

! This file was auto-generated with f2py (version:2).
! See http://cens.ioc.ee/projects/f2py2e/

If I now compile with "f2py --fcompiler=gfortran -c test.pyf test.f90 
test2.f90" I obtain test.so (same as running "f2py --fcompiler=gfortran 
-m test -c test.f90 test2.f90 without creating the signature file 
first).  Importing from this library in python exposes test.test.a and 
test.test2.b, but does not expose test.test2.a as can be seen here:

In [1]: import test

In [2]: print test.test.a
1

In [3]: print test.test2.b
2

In [4]: print test.test2.a
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/users/solbrig/svn_checkouts/inversion/satmet/branches/solbrig/rootpath/data/users/GeoIPS/src/test/<ipython-input-4-bffcf464e408> 
in <module>()
----> 1 print test.test2.a

AttributeError: a

Just to illustrate that "b" is defined properly in test2 from the 
perspective of fortran, the following code uses test2 and prints both 
"a" and "b":

SUBROUTINE run_test()
     USE test2
     IMPLICIT NONE
     print *, "a = ", a
     print *, "b = ", b
END SUBROUTINE run_test

After compiling with "f2py -m run_test -c test.f90 test2.f90 
run_test.f90" and obtaining run_test.so, run_test can be imported in 
python and works as expected:

In [1]: import run_test

In [2]: run_test.run_test()
  a =            1
  b =            2


Any help with this issue would be greatly appreciated.

Thanks,
Jeremy

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20130618/423103d2/attachment.html>


More information about the NumPy-Discussion mailing list