簡體   English   中英

使用 F2PY 創建 Fortran 擴展模塊,自定義簽名文件和子例程存儲在單獨的 Fortran 文件中?

[英]Create a Fortran extension module using F2PY with a custom signature file and subroutines stored in separate Fortran files?

作為練習,我正在嘗試創建一個 python 模塊fibadd1 ,其中包含一個方法fibadd 此方法將吃掉一個 integer 並吐出一個 numpy 數組,其中前 n 個斐波那契數加上 1(即 1、2、2、3,...)。 包含此例程的 Fortran 代碼是fib2.f ,並使用fib1.f中包含的子例程FIB 該子程序計算前 N 個斐波那契數。 僅使用這兩個文件,我就能夠使用名為test2.py的 python 腳本直接從源代碼成功編譯給定的例程。 但是,在嘗試像本教程中那樣創建自定義.pyf簽名文件時,我遇到了障礙。 簽名文件稱為fib2.pyf

我能夠使用命令行中的命令python -m numpy.f2py -c fib2.pyf fib2.f fib1.f --compiler=mingw32成功編譯和運行所有內容。 但是,我希望能夠使用numpy.f2py.run_main(...)numpy.f2py.compile(...)函數能夠在 Z23EEEB4347BDD26BFC6B7EE9A 腳本中執行此操作。 根據此文檔,它們似乎應該具有相同(或相似)的功能。 我嘗試的腳本稱為test3.py

它只是在退出時給出 1。 是否可以在 python 腳本中執行此操作? 還有比我鏈接的更多的文檔嗎? 我在解析numpy.f2py.compile function 時遇到問題。

源代碼如下:

fib2.f

C FILE: FIB2.F
      SUBROUTINE FIBADD(A,N)
C
C     ADD 1 TO THE FIBONACCI ROUTINE
C
      INTEGER N
      REAL*8 A(N)
      CALL FIB(A, N)
      DO I=1,N
          A(I) = A(I) + 1.0D0
      ENDDO
      END
C END FILE FIB2.F

fib1.f

C FILE: FIB1.F
      SUBROUTINE FIB(A,N)
C
C     CALCULATE FIRST N FIBONACCI NUMBERS
C
      INTEGER N
      REAL*8 A(N)
      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
      RETURN
      END
C END FILE FIB1.F

test2.py

import numpy.f2py
import numpy as np

with open('fib2.f') as file:
    source = file.read()
module = 'fibadd1'
args = ['fib1.f', '--compiler=mingw32']
failure = numpy.f2py.compile(source, modulename=module, 
                             extra_args=args, verbose=False)
print(failure)

import fibadd1
a = np.zeros(8, 'd')
fibadd1.fibadd(a)
print(a)

fib2.pyf

!    -*- f90 -*-
! Note: the context of this file is case sensitive.

python module fib2
    interface
        subroutine fibadd(a,n)
            real*8 dimension(n),intent(out),depend(n) :: a
            integer intent(in) :: n
        end subroutine fibadd
    end interface 
end python module fib2

! This file was auto-generated with f2py (version:2).
! See http://cens.ioc.ee/projects/f2py2e/

test3.py

import numpy.f2py
import numpy as np

with open('fib2.f') as file:
    source = file.read()
module = 'fibadd1'
args = ['fib2.pyf','fib1.f', '--compiler=mingw32']
failure = numpy.f2py.compile(source, modulename=module, 
                             extra_args=args, verbose=False)
print(failure)

事實證明,在修改后的.pyf文件中有兩行python module fib2end python module fib2指示導入的 python 模塊名稱將是什么(見圖)。 為了成功編譯, numpy.f2py.compile function 的modulename關鍵字必須與該名稱匹配。 因此,更正后的.py編譯腳本為:

import numpy.f2py

with open('fib2.f') as file:
    source = file.read()
    
module = 'fib2'
args = ['fib2.pyf','fib1.f', '--compiler=mingw32']

failure = numpy.f2py.compile(source, extra_args=args, 
                             modulename=module, verbose=False)
print(failure)

import fib2

a = fib2.fibadd(8)
print(a)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM