2011-12-19 19 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); python 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

あなたはPythonモジュールでのFortranモジュールを持ってしようとしています。それを望むなら、名前は異なっていなければなりません。

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つの異なるLinuxコンピュータでそれをテストしました。 –

+0

おかげでウラジミール! '.f90'拡張子に名前を変更すると、PythonモジュールとFortranモジュールが同じ名前を持っていてもうまく機能しました。 – 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 

は今、1つのコマンドで行うことができます。

f2py -c -m fib3 fib3.f 
+0

私の問題は、ファイルにサブルーチンが単独でリストされているときにf2pyがうまく動作することですが、モジュールにそれを囲むとエラーが発生します。あなたのリンクから、自分のソース(おそらくいくつかの追加のディレクティブで)を自分の署名ファイルとして使用できるはずです。モジュールを受け入れるために追加する必要があるディレクティブは何ですか? – astay13

関連する問題