f2py: Expondo parâmetros de módulos “usados”

Eu suponho que essa questão foi abordada em algum lugar, mas passei uma quantidade excessiva de tempo procurando a resposta, incluindo a digitação no código fonte um pouco. Eu tentei colocar o problema no primeiro parágrafo. O resto mostra um exemplo básico do problema.

Eu estou tentando compilar um módulo que contém umUSE declaração apontando para outro módulo mais geral. Eu preferiria manter o módulo usado separado para que ele possa ser usado em vários "pacotes" como um conjunto de configurações gerais. Quando eu compilar os dois módulos usando f2py tudo funciona como anunciado do lado de fortran, mas do lado do pythonUSE parece ser ignorado. Se eu permitir que o f2py gere um arquivo de assinatura, o arquivo conteráUSE declaração como é apropriado, mas se eu concluir a compilação e importar da biblioteca resultante os parâmetros do módulo usado não estão disponíveis no módulo que contém a instrução de uso. Abaixo estão dois módulos ilustrando a situação:

MODULE test
    INTEGER, PARAMETER :: a = 1
END MODULE test

MODULE test2
    USE test
    INTEGER, PARAMETER :: b = 2
END MODULE test2

Para mostrar o passo intermediário eu corrif2py -h test.pyf test.f90 test2.f90. O seguinte arquivo de assinatura é gerado; note que o módulo "test2" contém "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/

Se eu agora compilar comf2py --fcompiler=gfortran -c test.pyf test.f90 test2.f90 Eu obtenho test.so (mesmo que executandof2py --fcompiler=gfortran -m test -c test.f90 test2.f90 sem criar primeiro o ficheiro de assinatura). A importação desta biblioteca em python expõe test.test.a e test.test2.b, mas não expõe test.test2.a como pode ser visto aqui:

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

Apenas para ilustrar issob está definido corretamente no test2 a partir da perspectiva do fortran, o código a seguir usa o test2 e imprimeb eb:

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

Depois de compilar com "f2py -m run_test -c test.f90 test2.f90 run_test.f90" e obter o run_test.so, o run_test pode ser importado em python e funciona como esperado:

In [1]: import run_test

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

Qualquer ajuda com este assunto seria muito apreciada.

TL; DR : Quando um módulo F90 que contém umUSE é compilado por f2py ele não expõe os parâmetros que são definidos no módulo "usado" como atributos em Python.

questionAnswers(1)

yourAnswerToTheQuestion