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.