f2py: Odsłanianie parametrów z „używanych” modułów
Zakładam, że to pytanie zostało gdzieś zaadresowane, ale spędziłem niezmiernie dużo czasu, szukając odpowiedzi, w tym trochę zagłębiając się w kod źródłowy. Próbowałem umieścić problem w pierwszym akapicie. Reszta pokazuje podstawowy przykład problemu.
Próbuję skompilować moduł zawierającyUSE
instrukcja wskazująca na inny, bardziej ogólny moduł. Wolałbym zachować używany moduł osobno, aby mógł być używany w kilku „pakietach” jako zestaw ogólnych ustawień. Kiedy kompiluję dwa moduły za pomocą f2py, wszystko działa tak, jak jest reklamowane od strony fortran, ale od strony pytonaUSE
wydaje się być ignorowany. Jeśli pozwolę f2py wygenerować plik podpisu, plik zawieraUSE
oświadczenie, jeśli jest to właściwe, ale jeśli uzupełnię kompilację i zaimportuję z powstałej biblioteki, parametry z używanego modułu nie są dostępne w module zawierającym instrukcję użycia. Poniżej znajdują się dwa moduły ilustrujące sytuację:
MODULE test
INTEGER, PARAMETER :: a = 1
END MODULE test
MODULE test2
USE test
INTEGER, PARAMETER :: b = 2
END MODULE test2
Aby pokazać etap pośredni, uruchomiłemf2py -h test.pyf test.f90 test2.f90
. Generowany jest następujący plik podpisu; zauważ, że moduł „test2” zawiera „test użycia”:
! -*- 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/
Jeśli teraz się skompilujęf2py --fcompiler=gfortran -c test.pyf test.f90 test2.f90
Otrzymuję test.so (tak samo jak działaf2py --fcompiler=gfortran -m test -c test.f90 test2.f90
bez tworzenia pliku podpisu w pierwszej kolejności). Importowanie z tej biblioteki w python ujawnia test.test.a i test.test2.b, ale nie ujawnia test.test2.a, jak widać tutaj:
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
Aby to zilustrowaćb
jest poprawnie zdefiniowany w teście 2 z perspektywy fortran, poniższy kod wykorzystuje test2 i drukuje obab
ib
:
SUBROUTINE run_test()
USE test2
IMPLICIT NONE
print *, "a = ", a
print *, "b = ", b
END SUBROUTINE run_test
Po skompilowaniu za pomocą „f2py -m run_test -c test.f90 test2.f90 run_test.f90” i uzyskaniu run_test.so, run_test można zaimportować do Pythona i działa zgodnie z oczekiwaniami:
In [1]: import run_test
In [2]: run_test.run_test()
a = 1
b = 2
Każda pomoc w tym zakresie byłaby bardzo mile widziana.
TL; DR : Kiedy moduł F90 zawieraUSE
jest skompilowany przez f2py, nie ujawnia parametrów zdefiniowanych w module „used” jako atrybuty w Pythonie.