作为练习,我尝试创建一个python模块fibadd1
,它包含一个方法fibadd
。此方法将吃掉一个整数,并吐出前n个fibonacci数加1的numpy数组(即1,2,2,3,…)。包含此例程的Fortran代码为fib2.f
,并使用fib1.f
中包含的子例程FIB
。此子例程计算前N个斐波那契数。仅使用这两个文件,我就能够直接从源代码使用名为test2.py
的python脚本成功地编译给定的例程。然而,在尝试创建自定义.pyf
签名文件(如this tutorial)时,我遇到了一个障碍。签名文件名为fib2.pyf
我能够从命令行使用命令python -m numpy.f2py -c fib2.pyf fib2.f fib1.f --compiler=mingw32
成功编译并运行所有内容。但是,我希望能够使用numpy.f2py.run_main(...)
和numpy.f2py.compile(...)
函数在python脚本中实现这一点。基于this documentation,它们似乎应该具有相同(或类似)的功能。我尝试的脚本名为test3.py
它只在出口处打1。可以在python脚本中执行此操作吗?还有比我链接的更多的文档吗?我在解析numpy.f2py.compile
函数时遇到了问题
源代码如下:
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
函数的modulename
关键字必须与该名称匹配。因此,更正的.py
编译脚本是:相关问题 更多 >
编程相关推荐