f2py
현대의 포트란과 함께 사용 하고 싶습니다 . 특히 다음 기본 예제를 작동 시키려고합니다. 이것은 내가 생성 할 수있는 가장 작은 유용한 예입니다.
! alloc_test.f90
subroutine f(x, z)
implicit none
! Argument Declarations !
real*8, intent(in) :: x(:)
real*8, intent(out) :: z(:)
! Variable Declarations !
real*8, allocatable :: y(:)
integer :: n
! Variable Initializations !
n = size(x)
allocate(y(n))
! Statements !
y(:) = 1.0
z = x + y
deallocate(y)
return
end subroutine f
참고 n
입력 매개 변수의 형태로부터 추론된다 x
. 참고 y
할당 서브 루틴의 몸에서 해제된다.
내가 이것을 컴파일 할 때 f2py
f2py -c alloc_test.f90 -m alloc
그런 다음 파이썬에서 실행하십시오.
from alloc import f
from numpy import ones
x = ones(5)
print f(x)
다음과 같은 오류가 발생합니다
ValueError: failed to create intent(cache|hide)|optional array-- must have defined dimensions but got (-1,)
가서 pyf
파일을 수동으로 작성하고 편집합니다.
f2py -h alloc_test.pyf -m alloc alloc_test.f90
기발한
python module alloc ! in
interface ! in :alloc
subroutine f(x,z) ! in :alloc:alloc_test.f90
real*8 dimension(:),intent(in) :: x
real*8 dimension(:),intent(out) :: z
end subroutine f
end interface
end python module alloc
수정
python module alloc ! in
interface ! in :alloc
subroutine f(x,z,n) ! in :alloc:alloc_test.f90
integer, intent(in) :: n
real*8 dimension(n),intent(in) :: x
real*8 dimension(n),intent(out) :: z
end subroutine f
end interface
end python module alloc
이제는 실행되지만 출력 값 z
은 항상 0
입니다. 일부 디버그 인쇄는 서브 루틴 내에 n
값 을 가지고 있음을 나타냅니다 . 이 상황을 올바르게 관리하기 위해 헤더 마술이 누락되었다고 가정합니다 . 0
f
f2py
더 일반적으로 위의 서브 루틴을 파이썬에 연결하는 가장 좋은 방법은 무엇입니까? 서브 루틴 자체를 수정하지 않아도되는 것이 좋습니다.