[英]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 fib2
和end 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.