2011-12-19 2 views
3

f2py (아래 나열)로 컴파일하려고하는 Fortran 모듈이 있습니다. 모듈 선언을 제거하고 서브 루틴을 파일에 그대로두면 모든 것이 잘 동작합니다. 모듈은 다음과 같이 선언 된 경우, 나는 다음과 같은 결과를 얻을 :f2py로 fortran 모듈 컴파일

> f2py.py -c -m its --compiler=mingw itimes-s2.f 
... 
Reading fortran codes... 
    Reading file 'itimes-s2.f' (format:fix,strict) 
crackline: groupcounter=1 groupname={0: '', 1: 'module', 2: 'interface', 3: 'subroutine'} 
crackline: Mismatch of blocks encountered. Trying to fix it by assuming "end" statement. 
... 
c:\users\astay13\appdata\local\temp\tmpgh5ag8\Release\users\astay13\appdata\local\temp\tmpgh5ag8\src.win32-3.2\itsmodule.o:itsmodule.c:(.data+0xec): undefined reference to `itimes_' 
collect2: ld returned 1 exit status 

무엇 f2py의 모듈이나 서브 루틴을 컴파일에 대해 다른? f2py가 문제를 일으키는 중요한 것을 모듈에 남겨 두었습니까? gfortran을 단독으로 사용하면 모듈이 잘 컴파일됩니다.

소프트웨어 : Windows 7; gcc, gfortran 4.6.1 (MinGW); 파이썬 3.2.2; f2py V2

itimes-s2.f :

module its 

    contains 

    subroutine itimes(infile,outfile) 

    implicit none 

    ! Constants 
    integer, parameter :: dp = selected_real_kind(15) 

    ! Subroutine Inputs 
    character(*), intent(in) :: infile 
    character(*), intent(in) :: outfile 

    ! Internal variables 
    real(dp) :: num 
    integer :: inu 
    integer :: outu 
    integer :: ios 

    inu = 11 
    outu = 22 

    open(inu,file=infile,action='read') 
    open(outu,file=outfile,action='write',access='append') 

    do 
     read(inu,*,IOSTAT=ios) num 
     if (ios < 0) exit 

     write(outu,*) num**2 
    end do 

    end subroutine itimes 

    end module its 

답변

8

. 원하는 경우 이름이 달라야합니다.

f2py.py -c -m SOMEDIFFERENTNAME itimes-s2.f 

결과를 pythonmodule.fortranmodule.yourfunction()이라고합니다.

그렇지 않으면 내 컴퓨터에서 작동했습니다.

+0

나는'f2py -c --compiler = mingw32 -m itsm itimes-s2.f'를 실행하려했지만 오류 메시지는 여전히 동일하다. – astay13

+0

파일의 이름을 .f90 접미어로 바꾸십시오. 컴파일러는 고정 된 형식의 파일이라고 가정합니다 (최소한 내 시스템에서는). 'f2py -c -m itsm itimes-s2.f90'을 사용하고 있습니다. 나는 2 개의 다른 리눅스 컴퓨터에 그것을 시험했다. –

+0

감사합니다 블라디미르! 파이썬 모듈과 포트란 모듈이 같은 이름을 가지고있다하더라도, 확장자를 .f90으로 변경 한 것은 훌륭했습니다. – astay13

2

f2py를 들어 당신이 인터페이스 생성을 직접 또는 인터페이스에 도움이 f2py 의견 소스 코드를 수정하는 서명 파일이 있어야 작동합니다. 자세한 내용은 http://cens.ioc.ee/projects/f2py2e/usersguide/#signature-file을 참조하십시오. 해당 사이트에서

: 확장 모듈을 구축

C FILE: FIB3.F 
     SUBROUTINE FIB(A,N) 
C 
C  CALCULATE FIRST N FIBONACCI NUMBERS 
C 
     INTEGER N 
     REAL*8 A(N) 
Cf2py intent(in) n 
Cf2py intent(out) a 
Cf2py depend(n) a 
     DO I=1,N 
     IF (I.EQ.1) THEN 
      A(I) = 0.0D0 
     ELSEIF (I.EQ.2) THEN 
      A(I) = 1.0D0 
     ELSE 
      A(I) = A(I-1) + A(I-2) 
     ENDIF 
     ENDDO 
     END 
C END FILE FIB3.F 

은 이제 하나의 명령으로 수행 할 수 있습니다 : 당신은 파이썬 모듈에서 포트란 모듈이하려고하는

f2py -c -m fib3 fib3.f 
+0

하지만 문제는 f2py가 서브 루틴이 파일에 나열 될 때 제대로 작동하지만 모듈에 동봉 할 때 오류가 발생한다는 것입니다. 귀하의 링크에서 내 서명 파일로 내 소스 (아마도 일부 추가 지시문과 함께)를 사용할 수 있어야합니다. 모듈을 승인 할 수 있도록 추가로 포함해야하는 지시문은 무엇입니까? – astay13