Tworzę moduł Pythona w Fortranie przy użyciu f2py
. Chciałbym utworzyć błąd (w tym komunikat o błędzie) w programie Python, jeśli napotkany błąd w module Fortran. Rozważmy następujący przykład:Zatrzymanie kodu Pythona w module (Fortran) błąd modułu przy użyciu f2py?
kod Fortran (test.f):
subroutine foo(a,m)
integer :: m,i
integer, dimension(m) :: a
!f2py intent(in) :: m
!f2py intent(in,out) :: a
!f2py intent(hide), depend(a) :: m=shape(a)
do i = 1,m
if (a(i) .eq. 0) then
print*, 'ERROR HERE..?'
end if
a(i) = a(i)+1
end do
end subroutine
to bardzo prosty program dodaje 1
do każdego elementu a
. Ale powinien spowodować błąd, jeśli a(i)
jest równa zero. Towarzyszący kod Python:
import test
print test.foo(np.array([1,2],dtype='uint32'))
print test.foo(np.array([0,2],dtype='uint32'))
Wyjście jest teraz:
[2 3]
ERROR HERE..?
[1 3]
Ale Chcę program Python trzymać błędu. Proszę pomóż.
Odpowiedź
Komenda w Fortran stop
robi dokładnie to. Rozważmy zaktualizowany kod Fortran:
subroutine foo(a,m)
integer :: m,i
integer, dimension(m) :: a
!f2py intent(in) :: m
!f2py intent(in,out) :: a
!f2py intent(hide), depend(a) :: m=shape(a)
do i = 1,m
if (a(i) .eq. 0) then
print*, 'Error from Fortran'
stop
end if
a(i) = a(i)+1
end do
end subroutine
Wyjście jest teraz:
[2 3]
Error from Fortran
Tj kod Pythona nie jest kontynuowany po błędzie.
Czy próbujesz podnieść wyjątek Python z modułu Fortran? – user2357112
Tak, to jest dokładnie to, co próbuję zrobić. –
Jednym ze sposobów byłoby ponowne wykrycie kodu błędu z Fortran, sprawdzenie go po stronie Pythona i zgłoszenie wyjątku w przypadku wystąpienia błędu. –