使用F2PY创建Fortran扩展模块,自定义签名文件和子例程存储在单独的Fortran文件中?

2024-04-29 15:53:56 发布

您现在位置:Python中文网/ 问答频道 /正文

作为练习,我尝试创建一个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)

Tags: pyimportnumpy脚本args例程filemodule
1条回答
网友
1楼 · 发布于 2024-04-29 15:53:56

事实证明,在修改后的.pyf文件中有两行python module fib2end python module fib2指示导入的python模块名称(见图)。为了成功编译,numpy.f2py.compile函数的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)

相关问题 更多 >