2012-11-19 3 views
5

파이썬 프로그램에서 fortran 함수를 호출하여 어떤 값을 반환한다고 가정 해 보겠습니다.python과 fortran friends를 만드는 것

subroutine pow2(in_x, out_x) 
     implicit none 
     real, intent(in)  :: in_x 
!f2py real, intent(in, out) :: out_x 
     real, intent(out)  :: out_x 
     out_x = in_x ** 2 
     return 
end 

과 같은 방식으로 파이썬에서 호출 :

import modulename 
a = 2.0 
b = 0.0 
b = modulename.pow2(a, b) 

우리에게 작업 결과를 제공 나는 그런 식으로 포트란 코드를 재 작성 사실을 발견했다. 다른 방법으로 fortran 함수를 호출 할 수 있습니까? 첫 번째 방법은 약간 어색하다고 생각합니까?

+0

IPython 사용을 고려하십니까? – inspectorG4dget

+0

어떻게 도와 드릴까요? 내가 아는 한 업그레이드 된 대화식 모드입니다. – user983302

+1

또한 R, MATLAB 및 FORTRAN과 같은 다른 프로그램과도 연결할 수 있습니다. [이 비디오] (http://pyvideo.org/video/1605/science-and-python-retrospective-of-a-mostly-s)를 확인하십시오. – inspectorG4dget

답변

10

내가 방금 약간 f2py 기능 서명을 변경할 필요가 있다고 생각 (out_x가되도록에만 intent(out)in_xintent(in)입니다) :

이제
subroutine pow2(in_x, out_x) 
    implicit none 
    real, intent(in) :: in_x 
    !f2py real, intent(in) :: in_x 
    real, intent(out)  :: out_x 
    !f2py real, intent(out) :: out_x 
    out_x = in_x ** 2 
    return 
end subroutine pow2 

컴파일 :

f2py -m test -c test.f90 

지금 실행 :

>>> import test 
>>> test.pow2(3) #only need to pass intent(in) parameters :-) 
9.0 
>>> 

!test2.f90 
subroutine pow2(in_x, out_x) 
    implicit none 
    real, intent(in) :: in_x 
    real, intent(out)  :: out_x 
    out_x = in_x ** 2 
    return 
end subroutine pow2 

컴파일 :

f2py -m test2 -c test2.f90 

실행 :

>>> import test2 
>>> test2.pow2(3) #only need to pass intent(in) parameters :-) 
9.0 
>>> 
이 경우, f2py이없이 특별한 !f2py 의견이 제대로 기능 의 서명을 스캔 할 수 있음을

+0

와우, 정말 멋지다! 이 방법은 심지어 튜플에서 여러 변수를 반환 할 수 있습니다! 단지 내 호기심 때문에 다른 트릭이 있다면 지금 당장이 대답에 틱하지 않을 것입니다. – user983302

+0

저는'f2py'로 포트란 코드를 감싸는 것이 얼마나 쉬운 지 자주 감명 받았습니다. 그렇기 때문에 필자는 파이썬 C API 나 심지어 'Cython'을 배울 필요가 없었습니다. 어느 시점에서는 그 기술을 배우고 싶습니다. – mgilson

0

아보이의 또 다른 이점 intent(inout) 인수는 (몇 가지 다른 제한 사항과 함께) 결과 함수 can be considered PURE입니다. 이것은 함수형 언어에 의한 비 - 부작용 접근법과 관련이 있으며, Fortran 컴파일러에 의한 최적화 및 오류 검출 기능을 개선하여 자동 병렬화에 특히 중요합니다. 당신이 IPython을 사용하는 경우

0

, (추가 수입없이)가 수 단순히 코드에서이 기능을 사용하여 다음

%%fortran 
subroutine pow2(in_x, out_x) 
    implicit none 
    real, intent(in) :: in_x 
    real, intent(out)  :: out_x 
    out_x = in_x ** 2 
    return 
end subroutine pow2 

를 작성 할 수있는 마법의 명령을보십시오.