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.

questionAnswers(1)

yourAnswerToTheQuestion